Der erste entspricht:
%Vor%Der zweite entspricht:
%Vor% Somit wird --y
immer ausgeführt. In der ersten Zeile werden die Inkremente zuerst ausgeführt, so dass x = 1, y = 0
erwartet wird. In der zweiten Zeile wird das Dekrement von x
zuerst ausgeführt, so dass x = -1, y = -1
erwartet wird.
Wie in einem Kommentar (zu einer anderen Antwort) von Barmar erwähnt:
Und falls jemand sich fragt, warum das Komma zwischen
++x
und++y
nicht den gleichen Effekt hat, liegt das daran, dass(true? ++x)
überhaupt nicht gültig ist. Der Compiler scannt also weiter, bis er:
findet, aber darüber hinaus stoppt er, wenn ein Operator mit niedrigerer Priorität [(,
in diesem Beispiel) oder das Ende der Anweisung] erreicht wird.
y
ist Null, weil Komma die niedrigste Priorität unter allen C ++ Operatoren hat. Da der Vorrang niedriger als der des ternären Bedingungsoperators ist, werden die Bedingungsoperatoren als true? ++x, ++y : --x
und false? ++x, ++y : --x
analysiert. In beiden Fällen wird die --y
-Anweisung bedingungslos ausgeführt.
BEARBEITEN Das erste Komma ist anders, weil der Compiler eine ?
gefunden hat, also benötigt es nun :
, um den "when true" Ausdruck der Bedingung zu vervollständigen. Deshalb werden sowohl ++x
als auch ++y
verwendet.
Lesen Sie den Standard
§5.18 Komma operator [expr.comma]
¶1 Der Komma-Operator wird von links nach rechts gruppiert.
%Vor%Ein durch Komma getrenntes Ausdruckspaar wird von links nach rechts ausgewertet; Der linke Ausdruck ist ein verworfener Wert Ausdruck (Klausel 5). 83 Jede Wertberechnung und Nebenwirkung in Verbindung mit dem linken Ausdruck wird vor jeder mit dem richtigen Ausdruck verbundenen Wertberechnung und Nebenwirkung sequenziert. Der Typ und Wert des Ergebnisses sind die Art und der Wert des rechten Operanden; Das Ergebnis entspricht derselben Wertkategorie als sein rechter Operand, und ist ein Bit-Feld, wenn sein rechter Operand ein glvalue und ein bit-Feld ist.
¶2 In Kontexten, in denen Komma eine besondere Bedeutung hat [Beispiel: in Listen von Argumenten zu Funktionen (5.2.2) und Listen von Initialisierern (8.5) - Beispiel am Ende des Beispiels. Der Komma-Operator, wie in Abschnitt 5 beschrieben, kann nur erscheinen in Klammern. [Beispiel:
%Vor%hat drei Argumente, von denen das zweite den Wert 5. -end Beispiel]
hat
Tags und Links c++ precedence comma