Was wäre die Bewertungsreihenfolge von x = x ++ + ++ x; Sein? [Duplikat]

8

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?

    
Bill the Lizard 03.03.2010, 00:23
quelle

4 Antworten

13

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).

    
caf 03.03.2010, 00:25
quelle
3

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.

    
Kornel Kisielewicz 03.03.2010 00:28
quelle
2

Der C-Standard garantiert nicht, dass das Post-Inkrement tatsächlich nach dem Vorinkrement "passieren" wird. Das ist also undefiniertes Verhalten.

    
Earlz 03.03.2010 00:25
quelle
1

Das ist keine gültige C-Anweisung, daher macht es keinen Sinn, über die Evaluierungsreihenfolge zu sprechen.

    
Stephen Canon 03.03.2010 00:25
quelle

Tags und Links