Ich bin verwirrt über den Operator post ++ und pre ++, zum Beispiel im folgenden Code
%Vor%wird 10 drucken?
Es druckt 10, aber ich erwartete, dass es 11 drucken sollte
aber wenn ich das tue
%Vor%es wird elf drucken, wie ich es erwartet habe, also warum x = x ++; ändert sich nicht der Wert von x?
Nein, der Ausdruck von 10 ist korrekt. Der Schlüssel zum Verständnis des Grundes hinter dem Ergebnis ist der Unterschied zwischen Vorinkrement ++x
und Post-inkrement x++
Verbindungszuordnungen. Wenn Sie pre-increment verwenden, wird der Wert des Ausdrucks nach dem Ausführen des Inkrements genommen. Wenn Sie jedoch post-increment verwenden, wird der Wert des Ausdrucks vor inkrementiert und für die spätere Verwendung gespeichert, nachdem das Inkrementierungsergebnis in die Variable zurückgeschrieben wurde.
Hier ist die Abfolge der Ereignisse, die zu dem führen, was Sie sehen:
x
ist zugewiesen 10
++
in Post-Inkrement-Position wird der aktuelle Wert von x
(d. h. 10
) für die spätere Verwendung gespeichert 11
wird in x
gespeichert
10
wird wieder in x
gespeichert, wobei direkt über 11
geschrieben wird, das dort gespeichert wurde. Zitieren von den Java-Lernprogrammen - Assignment, Arithmetic und Unary Operators :
Die Inkrement / Dekrement-Operatoren können vor (Präfix) oder nach (Postfix) dem Operanden angewendet werden. Der Code
result++;
und++result;
enden beide mit einer Erhöhung des Ergebnisses um eins. Der einzige Unterschied besteht darin, dass die Präfixversion (++result
) den inkrementierten Wert darstellt, während die Postfixversion (result++
) den ursprünglichen Wert auswertet. Wenn Sie nur ein einfaches Inkrement / Dekrement durchführen, spielt es keine Rolle, welche Version Sie wählen. Aber wenn Sie diesen Operator als Teil eines größeren Ausdrucks verwenden, kann der von Ihnen gewählte einen signifikanten Unterschied ausmachen.
Post Increment (n ++) : Führe zuerst die Anweisung aus und erhöhe dann den Wert um eins.
Pre Increment (++ n) : Zuerst den Wert um eins erhöhen und dann die Anweisung ausführen.
Beispiel:
%Vor%Ich habe keine Referenz in JLS gefunden, daher basiert diese Antwort auf der Spekulation, dass Sie nicht undefiniertes Verhalten aufrufen, da dies Java ist.
%Vor%Dies basiert auf der Definition von Postfix- und Präfixoperatoren.
Tags und Links java post-increment increment pre-increment