Krishty hat es richtig erklaert, mit einem Fehler ( :-) ).
In C++ ist die Reihenfolge der Auswertung von Wirkungen vor einem Semikolon nicht spezifiziert
Es ist
*nicht* unspecified. Es ist undefined.
unspecified hieße: der Compiler muss dokumentieren wie seine Evaluierungsreihenfolge bei bestimmten Settings aussieht, und er muss konsistent bleiben.
undefined heisst, er darf sich bei jeder Gelegenheit neu entscheiden.
Uebrigens hat es relativ wenig mit dem Optimizer und dem tatsaechlich generierten Maschinencode zu tun: dieser darf sowieso optimieren wie er will, sofern sich das mit Sprachmitteln beobachtbare Programmverhalten nicht aendert ('
as is'-Prinzip).
Der Standard (C++0x - 1.9, 14-15)
14 Every value computation and side effect associated with a full-expression is sequenced before every value
computation and side effect associated with the next full-expression to be evaluated.
15 Except where noted, evaluations of operands of individual operators and of subexpressions of individual
expressions are unsequenced. [ Note: In an expression that is evaluated more than once during the execution
of a program, unsequenced and indeterminately sequenced evaluations of its subexpressions need not be
performed consistently in different evaluations. —end note ] The value computations of the operands of an
operator are sequenced before the value computation of the result of the operator. If a side effect on a scalar
object is unsequenced relative to either another side effect on the same scalar object or a value computation
using the value of the same scalar object, the behavior is undefined.
Meine Theorie zu Java's und C#'s Verhalten: es gibt enorm viele verschiedene Moeglichkeiten eine eindeutige und nicht voellig sinnlose Regel fuer die Abarbeitungsreihenfolge aufzustellen. Alle Operanden vorher zu evaluieren, in genau definierter Reihenfolge, ist schlichtweg eine der einfachsten Varianten.