Der Inkrementoperator erhöht bereits z
, Sie müssen den Rückgabewert nicht wieder zu z
zuweisen.
Ist ein Post-Inkrement. Es gibt z zurück und NACH, dass es z erhöht. In Ihrem ersten Beispiel vergeben Sie im Grunde nur 0 an z und Ihre Schleife sollte nicht enden.
In Ihrem zweiten Beispiel ordnen Sie den alten Wert von z x zu und erhöhen dann z. Dies bedeutet, dass Sie nicht wie im ersten Beispiel wieder in die Höhe von 0 steigen, sondern wenn z 5 erreicht (also ist z & lt; 5 falsch), z ist 5 und x ist 4 wegen des Post-Inkrements.
Wenn Sie den Post-Inkrement-Operator verwenden, müssen Sie das Ergebnis nicht der Variablen zuweisen.
Das heißt, Ihr Code sollte so aussehen:
%Vor% In Java gibt die Operation den Wert von z
vor dem Inkrement zurück (während die Variable hinter den Szenen inkrementiert wird), und dieser Wert wird dann an z
neu zugewiesen. Deshalb ändert es sich nie.
Der Pre-Increment-Operator führt das Inkrement durch und gibt das NEW-Ergebnis zurück, so dass Sie erhalten, was Sie erwarten:
%Vor% Dies wird 1234
ausgeben.
Denken Sie daran, Java bewertet Ihre Ausdrücke von rechts nach links (genau wie C und C ++),
Also, wenn dein Code
lautet %Vor%Wenn z 0 ist, bevor diese Zeile ausgeführt wird, geschieht Folgendes:
z++
wird als Ausdruck ausgewertet und gibt den Wert 0 z
wegen des Operators ++ inkrementiert und hat den Wert 1. z
z = (value returned by z++)
zurückgegebene Wert 0 war, wird z++
auf 0 zurückgesetzt. Wichtig ist, dass das Ergebnis der in z
enthaltenen Zuweisung ausgewertet wird, bevor die Variable z++
auf der linken Seite aktualisiert wird.
Es liegt daran, dass Sie den Wert von z einem Postfix-Operator zuweisen.
%Vor%Postfix-Operatoren erhöhen den Wert von z nach der Zuweisung von i .
Der unäre Operator ++
erhöht den Wert von z vor der Zuweisung von x .
Betrachte es als ++
vor z als +1 vor der Zuweisung, ++
nach z als +1 nach der Zuweisung.
Ich denke, das wird Ihnen eine ziemlich gute Erklärung geben.
Betrachten Sie diese Klasse:
%Vor%Dies ist der zugehörige Byte-Code:
%Vor%iconst_0
lädt die Konstante 0 auf den Stack (dies ist für die Zuweisung der Variable count
mit dem Wert 0
istore_1
speichert den Stapelwert ( 0
gerade) in die Variable 1 iload_1
lädt den int-Wert von der Variablen 1 ( 0
gerade) auf den Stapel zinc 1, 1
inkrementiert um 1
variable 1 ( count = 1
gerade jetzt) istore_1
speichert den Stack-Wert ( 0
gleich jetzt aus Schritt # 3) in die Variable 1 Nun sollte es ziemlich klar sein, wie count = count++
in Java kompiliert wird.
Der erste ist wahrscheinlich besser geschrieben als
%Vor%oder
%Vor%Das Vorinkrement ist hier wichtig, weil es inkrementiert und dann zugewiesen wird. Anstatt zuzuweisen und dann zu erhöhen - was keinen anderen Effekt hat als das Zurücksetzen auf 0 in Ihrem ersten Beispiel.
Seit z=z++
wird der alte Wert wieder auf z
zurückgesetzt, was zu einer Endlosschleife führt.
Der zweite wird beendet, weil Sie nicht wieder zu z zurückkehren:
%Vor%Dies wird 1234 drucken.
Wenn du etwas wie foo = foo++
schreibst, machst du es falsch. Im Allgemeinen, wenn Sie einen Ausdruck wie x = x++ + ++x;
sehen, ist etwas ernsthaft falsch. Es ist unmöglich vorherzusagen, wie Ausdrücke dieser Art bewertet werden. In Sprachen wie C
können solche Ausdrücke wie vom Implementierer gewünscht ausgewertet werden.
Ich empfehle dringend, mit dem Operator ++
herumzuspielen, weil Sie beim Lesen von Code darauf stoßen.
Wie andere bereits erwähnt haben, ist x++
der Postfixoperator und ++x
ist ein Präfixoperator.
Beachten Sie, dass die Werte von y
, z
und x
genau das sind, was sie nach dem Ausdruck nur sind. Was sie während der Ausführung von sind, ist undefiniert.
Wenn Sie also Code wie foo(x++, ++x, x)
sehen, führen Sie die Hügel aus.
Ihr eigenes Problem ist prägnanter geschrieben:
%Vor% Der obige Code hat den Vorteil, dass die Variable z
in der for
-Schleife definiert ist, so dass sie nicht versehentlich mit einer anderen Variablen kollidiert.
Das bedeutet, dass Sie zuerst den Wert von z (der sich in der richtigen Position befindet) dem z zuweisen (was in der linken Position ist), dann das Inkrement in rechts z (was keinen Nutzen bringt).