In Java wird die Bewertungsreihenfolge von links nach rechts angegeben. Gilt das auch für C und C ++ oder ist es implementierungsabhängig? Ich erinnere mich, dass die Bewertungsreihenfolge für Funktionsargumente nicht spezifiziert ist, aber was ist mit Unterausdrücken?
Es ist nicht spezifiziert, welches der Argumente für +
zuerst ausgewertet wird - aber das ist nicht einmal von Bedeutung, weil in C und C ++ das gleiche Objekt zweimal ohne einen dazwischenliegenden Sequenzpunkt zu modifizieren völlig undefiniert ist.
Hier ändern Sie x
drei Zeiten ohne einen dazwischenliegenden Sequenzpunkt, so dass Sie gut von der Reservierung entfernt sind;)
Der relevante Teil des C99-Standards ist "6.5 Expressions":
2 Zwischen dem vorherigen und dem nächsten Sequenzpunkt, den ein Objekt haben soll sein gespeicherter Wert wird höchstens einmal geändert durch die Bewertung eines Ausdrucks. Außerdem muss der vorherige Wert sein Nur lesen, um den Wert zu bestimmen gespeichert.
und
3 Die Gruppierung von Operatoren und Operanden wird durch die angezeigt Syntax. Außer wie später angegeben (für den Funktionsaufruf (), & amp; & amp ;;, ||,?:, und Kommaoperatoren), die Reihenfolge von Auswertung der Teilausdrücke und der Reihenfolge, in der Nebenwirkungen auftreten sind beide nicht spezifiziert.
Es ist möglich, einen gesetzlichen Code zu schreiben, der die nicht spezifizierte Reihenfolge der Auswertung zeigt - zum Beispiel:
%Vor% (Es ist nicht angegeben, ob Sie die Ausgabe von foobar
oder barfoo
erhalten).
C ++ 03 Standard 5.4
Außer wo angegeben, die Reihenfolge von Auswertung von Operanden einzelner Operatoren und Unterausdrücke von einzelne Ausdrücke und die Reihenfolge in denen Nebenwirkungen auftreten, ist nicht spezifiziert.53) Zwischen den vorherigen und nächste Sequenz zeigen einen Skalar Objekt soll seinen gespeicherten Wert haben höchstens einmal von der Bewertung eines Ausdrucks. Außerdem muss der vorherige Wert sein nur zugegriffen, um den Wert zu bestimmen zu speichernden. Die Voraussetzungen dafür Absatz ist für jeden zu erfüllen zulässige Reihenfolge der Teilausdrücke eines vollen Ausdrucks; Ansonsten ist das Verhalten nicht definiert.
... daher undefiniert und implementierungsabhängig.
Das ist keine gültige C-Anweisung, daher macht es keinen Sinn, über die Evaluierungsreihenfolge zu sprechen.