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
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
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:
i
werden durch einen Sequenzpunkt (die zweite Komma) getrennt.i
in i++
ist von allem anderen durch Sequenzpunkte getrennt.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).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. " –
Ich wollte antworten, aber ich tat es nicht. [Noch eine undefinierte Verhaltensfrage] ;-) –
@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? –
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.
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.
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. –
fügt diese Frage etwas zur Diskussion hinzu? – KevinDTimm
Was ist mit undefiniertem Verhalten gemeint. –
Nur aus Neugier: Was bedeutet '(i, i ++, i)' überhaupt? Ist das eine Liste? – sleske