2010-10-14 9 views
14

Ich bin sehr überzeugt mit der Erklärung, die ich gefunden habe, dass i = ++i is not undefined so weit wie C++ 0x betrifft, aber ich bin nicht in der Lage zu beurteilen, ob das Verhalten von i += ++i gut definiert ist oder nicht. Irgendwelche Abnehmer?Ist i + = ++ ich undefiniertes Verhalten in C++ 0x?

+0

g ++ sagt * ja, es ist UB. * – kennytm

+1

@KennyTM: Ich habe Version 4.5.0 und es warnt mich sogar, dass ich = ++ ich undefiniert bin. Welche Version verwendest du? Ist es dir gelungen, i = ++ i ohne die Warnung zu kompilieren? –

+0

Sowohl i = ++ i als auch i + = ++ i sind UB –

Antwort

9

Die Argumentation, die i = ++i wohldefiniert macht, kann ebenso verwendet werden, um zu beweisen, dass i += ++i auch wohldefiniert sein muss.

i += ++i entspricht i += (i += 1) und die neuen Sequenzregeln erfordern, dass die Zuordnung vor der Wertberechnung des i += 1-Unterausdrucks stattfindet.
Dies bedeutet, dass das Ergebnis des Ausdrucks i += ++i derselbe wie für i = 2 * i + 1 sein muss.

Edit: Ich muss meine Antwort revidieren, weil das Verhalten schließlich undefiniert ist.
Das Verhalten von i += ++i ist undefiniert, weil die Wertberechnungen der Unterausdrücke i (Argument der linken Seite) und ++i zueinander nicht sequenziell sind und eine davon eine Aktualisierung des Objekts i enthält.

Dies ist kein Problem für den Ausdruck i = ++i, weil es die i auf der linke Seite nicht eine L-Wert-to-rvalue Umwandlung erfährt, die im i += ++i Fall geschieht.


Nebenbei: Schreiben Sie keinen solchen Code in einem seriösen Projekt. Es hängt zu sehr davon ab, die Sequenzierungsregeln genau zu kennen, und es wird viele Leute geben, die entweder die Sequenzierungsregeln nicht richtig verstehen, sich der Änderung der Regeln, die das Ergebnis von DR 637 ist, nicht bewusst sind oder durch das Fehlen wichtiger Informationen stolpern Aspekte des fraglichen Ausdrucks (wie es mir bei der ersten Überarbeitung dieser Antwort passiert ist).

+0

i + = ++ ich wäre äquivalent zu i = i + ++ i; so dass ich nur einmal bewertet werde. Aber, ist es definiert, welches von i oder ++ i zuerst ausgewertet wird? –

+0

@Saurabh: Du hast Recht. Der Unterschied zwischen "i = ++ i" und "i + = ++ i" ist die Wertberechnung des linken "i", das mit dem "++ i" nicht sequenziert ist. Dies macht das Ergebnis undefiniert. Ich werde meine Antwort entsprechend aktualisieren. –

+0

Danke.Ich hatte das gleiche im Sinn, war mir aber nicht ganz sicher. –

Verwandte Themen