Inhaltsverzeichnis
3. Vergleich mit der C-Sprache
1. Phänomen
Beachten Sie den folgenden Code:
int i = 1;
i = i++;
System.out.println("i = " + i);
Gemäß den Verwendungsregeln des arithmetischen Operators ++ wird i zuerst zugewiesen und dann addiert oder subtrahiert. i sollte zuerst ein Wert von 1 zugewiesen werden und dann um 1 erhöht werden, sodass das endgültige Ausgabeergebnis von i theoretisch gleich 2 sein sollte.
Tatsächlich ist der Wert von i jedoch immer noch 1.
Operationsergebnis:
i = 1
2.Analyse
Diese Situation tritt bei JRE (Java Runtime Environment) auf ) hängt mit dem Betriebsmechanismus von JVM (Java Virtual Machine) zusammen. .
Beim Umgang mit i = i++;:
Erster Schritt: JVM erstellt eine temporäre Variable zum Speichern des Wertes i und weist sie < zu /span> . Der Wert des linken Werts i
Der zweite Schritt:Javas virtuelle Maschine (d. h. JVM) berechnet den Wert von i++. Das heißt, ich werde auf 2 erhöhen.
Schritt 3:Dann weisen Sie i den in der temporären Variablen gespeicherten Wert zu (d. h. i vor dem Inkrementieren), sodass der Wert von i immer noch 1 ist.
Das Problem besteht darin, dass die temporäre Variable, die von der JVM zum Speichern von i erstellt wurde, bevor sie inkrementiert wird, aufgrund der Ausführung das Post-i++ überschreibt Bestellprobleme. Der Wert von (d. h. die Auswirkung von i seit der Erhöhung).
Gehen Sie davon aus, dass die temporäre Variable den Namen temp trägt. Der einfache Vorgang ist wie folgt:
//当i++时 int i = 1; i = i++;
(1)temp = i; --->(2)i = i + 1; --->(3)i = temp;
//当++i时 int i = 1; i = ++i;
(1)i = i + 1; --->(2)temp = i; --->(3)i = temp;
3. Vergleich mit der C-Sprache
Den gleichen Code in C schreiben:
int i = 1;
int i = i++;
printf("i = %d", i);
Operationsergebnis:
i = 2;
Das Schreiben desselben Codes in der C-Sprache führt in Java zu unterschiedlichen Effekten. Der Grund dafür ist: In der C-Sprache konvertiert der Computer zuerst rvalue i linken Wert i zugewiesen, zu diesem Zeitpunkt ist der Wert von i 1. Wenn i++ erneut berechnet wird, wird i um 1 erhöht, sodass der Endwert von i 2 ist. In Java gibt es kein Problem, dass der Anfangswert den Wert nach i++ überschreibt.