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?
Antwort
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).
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? –
@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. –
Danke.Ich hatte das gleiche im Sinn, war mir aber nicht ganz sicher. –
- 1. Ist (++ i) ++ undefiniertes Verhalten?
- 2. Warum ist undefiniertes Verhalten in C zulässig?
- 3. Hat während (i--) s + = a [i]; Undefiniertes Verhalten in C und C++ enthalten?
- 4. C++ undefiniertes Verhalten mit Gewerkschaften
- 5. ist undefiniertes Verhalten in gegebenem Code?
- 6. Ist ein (leerer) Endlosschleife undefiniertes Verhalten in C?
- 7. Ist Zeigervergleich undefiniertes oder nicht spezifiziertes Verhalten in C++?
- 8. LLVM-Optimierungsfehler oder undefiniertes Verhalten?
- 9. Ist etwas undefiniertes Verhalten durch Auslassung?
- 10. std :: lock_guard verursacht undefiniertes Verhalten
- 11. Wird ein unbestimmter Wert undefiniertes Verhalten gelesen?
- 12. gcc-4.9 undefiniertes Verhalten Sanitizer
- 13. Schafft extern C mit C++ undefiniertes Verhalten, das in C, aber nicht in C++ zulässig ist?
- 14. reinterpret_cast/static_cast und undefiniertes Verhalten
- 15. Kann dies undefiniertes Verhalten verursachen?
- 16. Undefiniertes Verhalten, oder: Hat Swift Sequenzpunkte?
- 17. Zuordnung und Zeiger, undefiniertes Verhalten?
- 18. asynchrone Funktionsaufruf C++ 0x
- 19. Ist es undefiniertes Verhalten, einen freien Zeiger zu dereferenzieren?
- 20. in C/C++ ist x [i] * Y [i ++] immer gleich x [i] * y [i]
- 21. Ist dies ein undefiniertes Verhalten oder eine falsch positive Warnung?
- 22. Warum ist Math.sqrt (i * i) .floor == ich?
- 23. Was muss ich über C++ 0x wissen?
- 24. Reihenfolge der Auswertung: undefiniertes Verhalten? oder Kompilierer defekt?
- 25. C++ 0x regex in GCC
- 26. Unicode-Unterstützung in C++ 0x
- 27. Eine uint32-Variable in ein Bitfeld umwandeln - undefiniertes Verhalten?
- 28. C++ 0x: Speicherordnungs
- 29. Ist die perfekte Weiterleitung in C++ 0x reference_wrapper veraltet?
- 30. Ist "a +++ i" gleich "(a ++) + i" in C
g ++ sagt * ja, es ist UB. * – kennytm
@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? –
Sowohl i = ++ i als auch i + = ++ i sind UB –