2010-11-05 9 views
5

Warum ruft der folgende Ausdruck nicht definiertes Verhalten auf?Warum ist dieses undefinierte Verhalten?

int i = 5; 
i = (i,i++,i) + 1 

Meine Frage von Als beeinflusst question here

+0

fügt diese Frage etwas zur Diskussion hinzu? – KevinDTimm

+0

Was ist mit undefiniertem Verhalten gemeint. –

+1

Nur aus Neugier: Was bedeutet '(i, i ++, i)' überhaupt? Ist das eine Liste? – sleske

Antwort

11

Es ist nicht undefiniert.

hier für C Beantwortet, Sequence points and partial order

denke ich das gleiche in C gilt ++ (und hier ist meine Antwort, bevor ich diesen Link sah):

Der Komma-Operator eine Sequenz Punkt führt (und zwingt zu einem gewissen Grad die Reihenfolge, in der der Ausdruck ausgewertet werden müssen - nach links, bevor rechts), so:

  • die beiden Modifikationen des i werden durch einen Sequenzpunkt (die zweite Komma) getrennt.
  • Die Modifikation von i in i++ ist von allem anderen durch Sequenzpunkte getrennt.
  • die Modifikation von i von =nicht vom letzten Vorkommen von i im Ausdruck getrennt ist, aber das ist in Ordnung, weil wir i zugreifen sind erlaubt und es ohne einen dazwischenliegende Sequenz Punkt zu ändern, vorausgesetzt, dass der Zugriff " um den zu speichernden Wert zu bestimmen "(5/4).
  • Wie Als sagt, in der Praxis wäre es keine Rolle, ob das Codeverhalten definiert hat oder nicht vorgesehen, dass jeder den gesunden Menschenverstand hatte, nicht zu schreiben es ;-)
+0

Berücksichtigt nur die Tatsache, dass ',' ist ein Sequenzpunkt, ja. Leider ist der Standard diesbezüglich sehr vorsichtig: 'Beachten Sie, dass einige Aspekte der Sequenzierung in der abstrakten Maschine nicht spezifiziert sind; die vorhergehende Einschränkung auf Nebenwirkungen gilt für die bestimmte Ausführungssequenz, in der der tatsächliche Code generiert wird. " –

+0

Ich wollte antworten, aber ich tat es nicht. [Noch eine undefinierte Verhaltensfrage] ;-) –

+0

@Let_Me_Be: Ich gestehe, dass ich diese Fußnote nicht verstehe. Was bedeutet es, dass "tatsächlicher Code" in einer Ausführungssequenz generiert wird? –

0

Weil es nicht in der Norm, die von der Post-Inkrement oder die Übertragung stattfinden wird zunächst definiert ist; Es bleibt der Compiler-Implementierung überlassen, über ihre Reihenfolge zu entscheiden.

0

Es ist in C++ nicht definiert ist zuweisen ein erhöhter Wert an sich selbst:

i = i++ 

Was soll i nach sein? Sollte es der vorherige Wert oder eins plus der vorherige Wert sein? Die Reihenfolge der Ausführung wird dem Compiler überlassen, so dass unterschiedliche Plattformen unterschiedliche Ergebnisse haben.

+0

Ich bin mir ziemlich sicher, dass "i" danach unverändert bleiben sollte. Es ist immer noch technisch undefiniertes Verhalten wegen der Sequenzpunkt-Sache, aber es gibt keine Möglichkeit, dass es ein anderes Ergebnis geben könnte. –