verwirrt durch C ++ logisches ODER (||) operator [duplizieren]

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. 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.

%Vor%

danke im voraus, Lin

    
Lin Ma 02.12.2015, 08:20
quelle

3 Antworten

10

Ja, es ist eine garantierte Funktion namens Kurzschlussauswertung .

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

    
wallyk 02.12.2015, 08:23
quelle
8
  

frage mich, 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, der rechte Teil wird nie aufgerufen?

Ja, für den eingebauten Operator.

Vom Standard $ 5,15 / 1 logischer ODER-Operator [expr.log.or] (fett von mir)

  

Die || Operatorgruppen von links nach rechts. Die Operanden sind beides   kontextuell in bool umgewandelt (Abschnitt 4). Es gibt auch wahr zurück   seiner Operanden ist wahr und ansonsten falsch. Im Gegensatz zu |, || Garantien   Links-nach-rechts-Bewertung; Außerdem ist der zweite Operand nicht   ausgewertet, wenn der erste Operand true ergibt .

Beachten Sie, dass die Überladung von operator|| diese spezielle Eigenschaft verliert.

Logische Operatoren (fett von mir)

  

Eingebaute Operatoren & amp; & amp; und || Kurzschlussauswertung durchführen (nicht   werte den zweiten Operanden aus, wenn das Ergebnis nach der Auswertung bekannt ist   der erste), aber überladene Operatoren verhalten sich wie normale Funktion   ruft und evaluiert immer beide Operanden .

    
songyuanyao 02.12.2015 08:24
quelle
1

Da die eine oder andere Wahl nicht für die Auswertung des zweiten Teils notwendig ist, ist plattformabhängig kein Sprachmerkmal.

    
Netwave 02.12.2015 08:24
quelle

Tags und Links