2015-12-02 11 views
8

Angenommen, ich habe zwei Ausdrücke links/rechts von || Operator. Ich finde, wenn der linke Ausdruck wahr ist, wird der richtige Operator niemals aufgerufen werden. Zum Beispiel, in meinem unteren Code, wenn getRand Wahr zurückgibt, fand ich Foo wird nie aufgerufen werden. Ich habe XCode auf Mac OSX getestet und mich gefragt, ob es sich um ein zuverlässiges Feature von C++ handelt, auf das wir uns verlassen könnten - wenn der linke Teil von || ist wahr, wird der rechte Teil nie aufgerufen, oder ist es ein spezielles Feature nur für bestimmte Plattformen (z. B. OSX mit XCode)? Poste meinen Code unten, danke.verwirrt durch C++ logisches ODER (||) operator

bool Foo() 
{ 
    std::cout << "I am called!\n"; 
    return false; 
} 

bool getRand() 
{ 
    int random_variable = std::rand(); 
    std::cout << random_variable << '\n'; 

    return random_variable % 2 == 1; 
} 

int main(int argc, const char * argv[]) { 

    if (getRand() || Foo()) 
    { 
     std::cout<<"Hello World \n"; 
    } 

    return 0; 
} 

Vielen Dank im Voraus, Lin

+2

"Ich frage mich, ob es eine zuverlässige Funktion von C++ ist, auf die wir uns verlassen können." Ja, ist es. – Matt

+2

&& haben auch eine Kurzschlussauswertung, wenn das erste Argument falsch ist – sp2danny

+2

Kurzschlussauswertung ist ein zuverlässiges Merkmal _meistens der Zeit_. Es wird nicht funktionieren, wenn der verwendete Typ einen überladenen Operator && hat. Primitive Typen wie 'bool' sind sicher. – kolrabi

Antwort

10

Ja, ist es eine zugesicherte Eigenschaft short circuit evaluation genannt.

Ebenso wird ein Ausdruck false && expression niemals den richtigen Ausdruck auswerten.

+0

Danke Wallyk! Als beantwortet markieren :) –

8

frage mich, ob es eine zuverlässige Funktion von C++ ist, auf die wir uns verlassen könnten - wenn der linke Teil von || ist wahr, der rechte Teil wird nie genannt werden?

Ja, für den eingebauten Bediener.

Vom Standard $ 5.15/1 Logisches OR-Operator [expr.log.or] (fett von mir)

Die || Operatorgruppen von links nach rechts. Die Operanden sind beide kontextabhängig in bool konvertiert (Abschnitt 4). Es gibt wahr zurück, wenn entweder seiner Operanden wahr ist, und andernfalls falsch. Im Gegensatz zu |, || garantiert Links-nach-rechts-Auswertung; Außerdem wird der zweite Operand nicht ausgewertet, wenn der erste Operand wahr auswertet.

Und beachten Sie, dass die Überlastung von operator|| diese spezielle Eigenschaft verlieren wird.

Logical operators (fett von mir)

Builtin Betreiber & & und || Kurzschlussauswertung durchführen (nicht den zweiten Operanden auswerten, wenn das Ergebnis nach Auswertung von der erste bekannt ist), aber überladene Operatoren verhalten sich wie normale Funktion Aufrufe und werten immer beide Operanden aus.

+0

Danke songyuanyao, ausgezeichnete Antwort. Stimme hoch. :) –

1

Da es die eine oder andere Wahl gibt, muss der zweite Teil nicht ausgewertet werden, ist nicht plattformabhängig eine Spracheigenschaft.

+1

Danke Daniel, ausgezeichnete Antwort. Stimme hoch. :) –

Verwandte Themen