PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu C++


Corrail
2005-09-14, 17:46:04
Hello!

Nach eine kleiner Disskussion sind wir auf ein nettes C++ Quests gestoßen. Und zwar ist uns folgende C++ Zeile eingefallen:

int i = 0;
++i = i++ + ++i;

Komischer Weise hat i nach dieser Zeile den Wert 5 (kompilier mit GCC) was wir uns nicht erklären können...
Wieso hat i nach dieser Zeile den Wert 5? Eigentlich sollte es ja so ausgewertet werden:
= operator von rechts nach links:
also zuerst i++ + ++i auswerten
+ operator von links nach recht
zuerst i++
haben wir auf der rechten seite des = operator 0 stehen
dann wirkt das ++, i hat den wert 1
als nächstes das ++ von ++i, i hat den wert 2
also haben wir auf der rechten seite vom = operator 2 stehen
dann linke seite vom operator= auswerten: ++i , i hat den wert 3
dann wird der = operator ausgewertet und 2 wird auf ++i (was eine referenz auf i ist) zugewiesen
somit sollte i nach dieser zeile 2 haben

Ist das eine Eigenheit vom GCC oder hab ich da einen Denkfehler?

5tyle
2005-09-14, 18:11:35
int i = 0;
++i = i++ + ++i;

also ich seh das so (wie sollte es sonst anders sein?!)

++i es wird um 1 erhöht i = 1

i++ es wird um 1 erhöht i = 2

es wird mit ++i addiert und das ist 3 also

2 + 3 = 5

oder??

edit: zumindest stimmts von unten nach oben.. :confused:
aber irgendwie liegt da ein grober denkfehler vor moooooment

Trap
2005-09-14, 18:32:27
Der C++ Standard schreibt für die Zeile kein Ergebnis vor.

2 ist genauso richtig wie 5.

Link: http://www.embedded.com/shared/printableArticle.jhtml?articleID=9900661

Coda
2005-09-14, 18:33:06
Die Zeile ist einfach undefined behaviour.

GloomY
2005-09-14, 19:33:48
Das hatten wir doch schon mal: ;)

http://www.forum-3dcenter.org/vbulletin/showthread.php?t=59412&highlight=Operatorenreihenfolge

Corrail
2005-09-14, 23:07:29
Das hatten wir doch schon mal: ;)

http://www.forum-3dcenter.org/vbulletin/showthread.php?t=59412&highlight=Operatorenreihenfolge

Ah, sehr interessant!
Werd mir das mal genauer durchlesen, danke