Es gibt ja auch sonst Dinge die in C++ undefiniert sind aber nicht dazu führen, dass meine Festplatte formatiert wird.
Wenn du nicht sowieso dabei bist, eine Operation auszuführen die mit entsprechenden Argumenten deartiges tun könnte: Es ist wahrscheinlicher, dass Volkard in Stöckelschuhen und Latex vor deinem Haus auftaucht. Warum also nicht das als ein Beispiel nehmen? Volkard hat sicherlich nichts dagegen? (Also wie eine Schlampe gekleidet durch die Nachbarschaft zu rennen, meine ich. Nicht Subjekt eines dummen Witzes zu sein, das würde niemals jemand wagen.)
Da ist auch nicht definiert ob zuerst a oder b incrementiert wird
Nicht spezifiziert. Kann auch beides gleichzeitig passieren.
aber trotzdem sind am Ende alle Werte klar definiert.
Alle möglichen.
Alles kann passieren, bis zum Formatieren der Festplatte.
Laut Standard - der aber keine Festplatten kennt. Und wenn ich nach x86 gehe, würde eine race condition oder so per se nichts schädliches anrichten.
---
Der Unterschied ist hier vorzufinden:
If A is not sequenced before B and B is not sequenced before A, then A and B are unsequenced. [ Note: The execution of unsequenced evaluations can overlap. — end note ]
Evaluations A and B are indeterminately sequenced when either A is sequenced before B or B is sequenced before A, but it is unspecified which. [ Note: Indeterminately sequenced evaluations cannot overlap, but either could be executed first. — end note ]
I.e. im Fall n + n++ ist es sogar möglich dass, wie am Anfang des zitierten Paragraphen auch impliziert*, beide Ausdrücke gleichzeitig ausgewertet werden. Das würde zu einer race condition führen. Ich nehme an dass, da die Implementierungen nicht dazu verdonnert werden sollten, derartiges zu behandeln oder ihre Optimierung anzupassen, man es als undefiniert abgestempelt hat.
(Muss es aber nicht sein, ein relativ neues Paper von Sutter und Stroustrup beschäftigt sich damit die Auswertungsreihenfolge festzulegen.)
Wie auch immer, für Funktionen ändert sich die Lage wie folgt:
§1.9/15 schrieb:
Every evaluation in the calling function (including other function calls) that is not otherwise specifically sequenced before or after the execution of the body of the called function is indeterminately sequenced with respect to the execution of the called function.
I.e., die Ausführung des Inkrements innerhalb der Funktion ist indeterminately sequenced im Vergleich zum Zugriff auf den Wert der Variable. Wir haben also lediglich unspezifiziertes Verhalten, das in keinster weise konsistent sein braucht.
* Impliziert wird, dass für den + -Operator keine Ausnahme bezüglich
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 ]
besteht.