2011-01-08 5 views
0

Wieder eine dumme Frage.Führt Postfix Inkrement erhöhen nicht auf zurückgegebenen Wert?

#include <stdio.h> 
#include <iostream> 
using namespace std; 

int main() 
{ 
int i = 0; 
i = i++; 
cout<<i; 

return 0; 
} 

ich 1 als Folge dieses Programms gedruckt, obwohl ich 0 erwartet: erste ein temporäres Objekt gleich 0 erstellt eing, dann wird i erhöht, dann Temp-Objekt zurückgegeben und i zugeordnet. Gerade nach:

5.2.6 Inkrement- und Dekrement [expr.post.incr] der Wert 1 erhalten, indem eine Postfix ++ Anwendung ist der Wert daß der Operand vor der Anwendung der Operator hatte. [Anmerkung: Der Wert erhält eine Kopie des Original Wert]

ich es unter MS VC 2008 und GCC geprüft. Sie geben beide das gleiche Ergebnis, obwohl mindestens gcc in der Inkrementierungszeichenfolge eine Warnung ausgibt. Wo liege ich falsch?

Antwort

0

Das Verhalten von

i = i++; 

ist nicht definiert. Wenn ein einzelner Ausdruck einer Variablen zwei verschiedene Werte zuweist, sagt die C++ - Spezifikation, dass alles passieren kann - es könnte seinen alten Wert, einen der beiden neuen Werte oder so ziemlich alles annehmen. Der Grund dafür ist, dass der Compiler sehr viel aggressivere Optimierungen einfacher Ausdrücke vornehmen kann. Der Compiler könnte die Reihenfolge ändern, in der die Zuweisung und ++ ausgeführt werden, z. B. wenn es effizienter wäre.

+0

Könnten Sie bitte einen Prooflink zum Standard geben, warum dieser nicht definiert ist? Ich vermutete es, habe aber keinen Beweis gefunden. Und nur GCC bietet eine Warnung im "-Wall" -Modus. – flashnik

+0

Das Ergebnis ist das gleiche auch ohne Optimierungen und im Debug-Modus. – flashnik

+3

http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points/4176333#4176333 – ybungalobill

Verwandte Themen