Java-Inkrement- und Zuweisungsoperator

9

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?

    
user3803547 03.07.2014, 23:18
quelle

5 Antworten

10

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
  • Wegen ++ in Post-Inkrement-Position wird der aktuelle Wert von x (d. h. 10 ) für die spätere Verwendung gespeichert
  • Neuer Wert von 11 wird in x gespeichert
  • Der temporäre Wert von 10 wird wieder in x gespeichert, wobei direkt über 11 geschrieben wird, das dort gespeichert wurde.
dasblinkenlight 03.07.2014, 23:21
quelle
1

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.

    
Barranka 03.07.2014 23:23
quelle
1

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%     
bartektartanus 03.07.2014 23:25
quelle
0

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.

    
merlin2011 03.07.2014 23:22
quelle
-1

Wenn Sie dies tun:

%Vor%

Es wird tatsächlich in "Assign 'x' zu 'x' übersetzt und dann 'x' um eins erhöht".

Während in diesem Fall:

%Vor%

Es wird übersetzt in "Inkrementiere x 'um eins und weise es dann auf' x '" zu.

    
TheStack 03.07.2014 23:23
quelle