Post-Inkrement-Frage

8

Ich habe diesen Code

%Vor%

Ich habe erwartet, dass die Ausgabe x = 57 und y = 94 ist. Aber bei der Ausführung gab es 56 und 93. Aus irgendeinem Grund wird der Post-Inkrement-Operator nicht in Zeile 3 ausgeführt.

Liegt das daran, dass wir das Ergebnis des Ausdrucks in Zeile 3 x selbst zuweisen? Gibt es andere Szenarien, in denen der Post-Inkrement-Operator nicht wie erwartet ausgegeben wird.

Danke.

    
stackoverflow 12.12.2010, 10:50
quelle

3 Antworten

13
%Vor%     
khachik 12.12.2010, 11:06
quelle
9

Die Regeln in C # sind extrem einfach. Sie sind:

  • Unterausdrücke eines Ausdrucks werden LINKS NACH RECHTS, Zeitraum, Ende der Geschichte ausgewertet.
  • Der Nebeneffekt eines Inkrementoperators tritt auf, wenn der Operator ausgewertet wird.

Also in deinem Fall bricht das so zusammen; Ich tue so, als ob wir das in C statt in C # machen würden, so dass die Adressen und Dereferenzierungen klarer sind.

%Vor%

Werten Sie die Adresse von x aus und speichern Sie diese.

%Vor%

Werten Sie die Adresse von y aus.

%Vor%

Werten Sie den Wert aus, der in der gerade berechneten Adresse gespeichert ist. Das ist 35.

%Vor%

Der gerade berechnete Wert ist der Wert des Ausdrucks; es ist der Wert vor das Inkrement.

Fügen Sie einen Wert zu diesem Wert hinzu.

%Vor%

Speichern Sie 36 in der Adresse. y ist jetzt 36.

%Vor%

Nun mach dasselbe für x ++:

%Vor%

OK, jetzt müssen wir den Zusatz machen:

%Vor%

und weisen Sie dies der zuerst berechneten Adresse zu:

%Vor%

Am Ende dieser Aussage hatte x drei Werte. 20, 21 und 55. y hatte zwei Werte, 35 und 36. x ist jetzt 55 und y ist jetzt 36.

%Vor%

Nun machen wir dasselbe nochmal, nur diesmal benutzen wir die Werte nach den Inkrementen. Folgen Sie:

%Vor%

Am Ende dieser Aussage hatte y drei Werte: 36, 37 und 93. x hatte zwei Werte: 55 und 56. y ist jetzt 93 und x ist jetzt 56.

  

Ich habe erwartet, dass die Ausgabe x = 57 und y = 94 ist.

Warum haben Sie das erwartet? Ihre Erwartung widersprach der C # Spezifikation; Ich würde gerne erfahren, warum Sie das falsche Ergebnis erwartet haben. Wie haben Sie erwartet, dass der Code dafür generiert wird? Haben Sie erwartet, dass die Inkremente nach der Zuweisung passieren? Warum sollten sie das tun? Das Inkrement passiert, wenn der Wert des Inkrementoperators ausgewertet wird und natürlich muss vor der Addition geschehen, was offensichtlich vor der Zuweisung geschehen muss. Das Inkrementieren kann also nicht nach der Zuweisung erfolgen.

  

Aus irgendeinem Grund wird der Post Increment Operator nicht in Zeile 3 ausgeführt.

Wie kommen Sie zu dieser Schlussfolgerung? Ich versichere Ihnen, dass es sicherlich ausgeführt wird. Durchlaufen Sie die Ausführung in einem Debugger, wenn Sie mir nicht glauben.

    
Eric Lippert 12.12.2010 15:48
quelle
3

Die Reihenfolge der Ausführung wird durch Vorrang und Assoziativität des Operators bestimmt.

Zuweisung ist rechtsassoziativ, also

%Vor%

kann umgeschrieben werden

%Vor%

Ich konnte keine sehr klare Aussage dafür finden, dass das ++ vor dem = passiert.
Der Text in § 14.2 des Ecma-Dokuments impliziert jedoch, dass der Nebeneffekt im Rahmen der Evaluierung von i++ selbst auftritt. In F(i) + G(i++) * H(i) , H(i) wird mit dem neuen Wert von i aufgerufen.

    
Henk Holterman 12.12.2010 11:05
quelle

Tags und Links