Die einzige richtige Antwort auf Ihre Frage lautet: Weil sie undefiniert ist.
Ok, bevor ihr mich alle verbrennt ..
Sie alle haben geantwortet, warum i+=i++es in Ordnung und logisch ist, daraus zu resultieren i=0.
Ich war versucht, jede einzelne Ihrer Antworten abzustimmen, aber der von mir berechnete Reputationshit wäre zu hoch.
Warum bin ich so sauer auf euch Leute? Nicht aufgrund dessen, was Ihre Antworten erklären.
Ich meine, jede Antwort, die ich las, hatte bemerkenswerte Anstrengungen unternommen, um das Unmögliche zu erklären. Ich applaudiere!
Aber was ist das Ergebnis? ist es ein intuitives Ergebnis - ist es ein akzeptables Ergebnis?
Jeder von euch hat den "nackten König" gesehen und ihn irgendwie als vernünftigen König akzeptiert.
Ihr seid alle FALSCH!
i+=i++;Ergebnis in 0ist undefiniert.
ein Fehler im Sprachbewertungsmechanismus, wenn Sie so wollen ... oder noch schlimmer! ein Fehler im Design.
Willst du einen Beweis? natürlich willst du!
int t=0; int i=0; t+=i++; //t=0; i=1
Nun ... das ist ein intuitives Ergebnis! weil wir es zuerst tmit einem Wert bewertet haben und erst nach Bewertung und Zuweisung die Nachoperation durchgeführt wurde - rational, nicht wahr?
ist es rational, dass: i=i++und i=idas gleiche Ergebnis für liefern i?
während t=i++und t=ihaben unterschiedliche Ergebnisse füri .
Die Nachoperation sollte nach der Auswertung der Anweisung erfolgen.
Deshalb:
int i=0;
i+=i++;
Sollte das gleiche sein, wenn wir geschrieben haben:
int i=0;
i = i + i ++;
und daher das gleiche wie:
int i=0;
i= i + i;
i ++;
und daher das gleiche wie:
int i=0;
i = i + i;
i = i + 1;
Jedes Ergebnis, das nicht ist 1 auf einen Fehler im Complier oder einen Fehler im Sprachdesign hinweist, wenn wir rational denken - MSDN und viele andere Quellen sagen uns jedoch: "Hey - das ist undefiniert!"
Bevor ich fortfahre, wird selbst diese Reihe von Beispielen, die ich gegeben habe, von niemandem unterstützt oder anerkannt. Dies sollte jedoch auf intuitive und rationale Weise das Ergebnis sein.
Der Codierer sollte keine Kenntnis davon haben, wie die Baugruppe geschrieben oder übersetzt wird!
Wenn es so geschrieben ist, dass die Sprachdefinitionen nicht berücksichtigt werden, ist es ein Fehler!
Und zum Schluss habe ich dies aus Wikipedia kopiert: Inkrement- und Dekrementierungsoperatoren :
Da der Inkrementierungs- / Dekrementierungsoperator seinen Operanden ändert, kann die mehrmalige Verwendung eines solchen Operanden innerhalb desselben Ausdrucks zu undefinierten Ergebnissen führen . In Ausdrücken wie x - ++ x ist beispielsweise nicht klar, in welcher Reihenfolge die Subtraktions- und Inkrementoperatoren ausgeführt werden sollen. Situationen wie diese werden noch schlimmer, wenn der Compiler Optimierungen anwendet, was dazu führen kann, dass die Reihenfolge der Ausführung der Operationen anders ist als vom Programmierer beabsichtigt.
Und deshalb.
Die richtige Antwort ist, dass dies nicht verwendet werden sollte! (wie es UNDEFINIERT ist!)
Ja .. - Es hat unvorhersehbare Ergebnisse, selbst wenn der C # -Konformator versucht, es irgendwie zu normalisieren.
Ich habe keine Dokumentation von C # gefunden, die das Verhalten beschreibt, das Sie alle als normales oder genau definiertes Verhalten der Sprache dokumentiert haben. Was ich gefunden habe, ist genau das Gegenteil!
[ kopiert aus der MSDN-Dokumentation für Postfix Increment and Decrement Operators: ++ und - ]
Wenn ein Postfix-Operator auf ein Funktionsargument angewendet wird, kann nicht garantiert werden , dass der Wert des Arguments inkrementiert oder dekrementiert wird, bevor er an die Funktion übergeben wird. Weitere Informationen finden Sie in Abschnitt 1.9.17 des C ++ - Standards.
Beachten Sie diese Wörter nicht garantiert ...
Vergib mir, wenn diese Antwort arrogant erscheint - ich bin keine arrogante Person. Ich denke nur, dass Tausende von Menschen hierher kommen, um zu lernen, und die Antworten, die ich lese, werden sie irreführen und ihre Logik und ihr Verständnis des Themas schädigen.