5

Wenn Sie die folgenden Schritte aus:Hat die ternäre Operator Kurzschluss in definierter Weise

if (x) 
{ 
    y = *x; 
} 
else 
{ 
    y = 0; 
} 

Dann wird das Verhalten garantiert definiert werden, da können wir nur dereferenzieren x wenn es nicht 0

Kann das ist gleiche gesagt werden für:

y = (x) ? *x : 0; 

Dies scheint wie erwartet zu arbeiten (auch mit -Wpedantic auf g ++ kompiliert)

Ist das garantiert?

+0

Ja - Der ternäre Operator ist nur syntaktischer Zucker –

+3

Ja. (Zu kurz, um als Antwort gepostet zu werden). – JSF

+0

Es gibt keinen "Kurzschluss" im ternären Ausdruck. Und es wird keine Verzweigung vorzeitig ausgewertet oder ausgeführt, bevor die Bedingung vollständig ausgewertet wurde. –

Antwort

12

Ja, nur die zweite oder dritte Operand ausgewertet werden, der Entwurf C++ Standard Abschnitt 5.16[expr.cond] sagt:

Bedingte Ausdrücke Gruppe von rechts nach links. Der erste Ausdruck wird kontextabhängig in bool umgewandelt (Abschnitt 4). Es wird ausgewertet, und wenn es wahr ist, ist das Ergebnis des bedingten Ausdrucks der Wert des zweiten Ausdrucks, andernfalls das des dritten Ausdrucks. Nur einer der zweiten und dritten Ausdrücke wird ausgewertet. Jeder Wert Berechnung und Nebeneffekt mit dem ersten Ausdruck verbunden ist vor jeder Wertberechnung und Nebenwirkung mit dem zweiten oder dritten Ausdruck verbunden sequenziert.