Java-Operator ++ Problem

8

Ich frage mich, warum der erste Code-Ausgang 000 ist, während der zweite 123

ist

erster:

%Vor%

zweite:

%Vor%

Was ist der Unterschied zwischen diesen beiden Codes, warum der erste Block den Wert des z nicht erhöht?

    
shanky 04.08.2011, 17:15
quelle

9 Antworten

13

z=z++ ist ein Fehler des Programmierers - was er tut, ist z inkrementieren und dann z auf seinen alten Wert setzen - infolgedessen überschreibt er z mit seinem alten Wert und hebt somit das Inkrement auf.

    
Jason S 04.08.2011 17:18
quelle
8

Der Inkrementoperator erhöht bereits z , Sie müssen den Rückgabewert nicht wieder zu z zuweisen.

%Vor%

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.

    
Jacob 04.08.2011 17:18
quelle
3

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.

    
Platinum Azure 04.08.2011 17:19
quelle
2

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:

  1. z++ wird als Ausdruck ausgewertet und gibt den Wert 0
  2. zurück
  3. Dann wird z wegen des Operators ++ inkrementiert und hat den Wert 1.
  4. Nun ist% ce_de% auf der linken Seite ein Wert z
  5. Da der von 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.

    
Rajesh J Advani 19.05.2012 13:51
quelle
1

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.

    
John Giotta 04.08.2011 17:19
quelle
1

Ich denke, das wird Ihnen eine ziemlich gute Erklärung geben.

Betrachten Sie diese Klasse:

%Vor%

Dies ist der zugehörige Byte-Code:

%Vor%
  1. iconst_0 lädt die Konstante 0 auf den Stack (dies ist für die Zuweisung der Variable count mit dem Wert 0
  2. istore_1 speichert den Stapelwert ( 0 gerade) in die Variable 1
  3. iload_1 lädt den int-Wert von der Variablen 1 ( 0 gerade) auf den Stapel
  4. zinc 1, 1 inkrementiert um 1 variable 1 ( count = 1 gerade jetzt) ​​
  5. istore_1 speichert den Stack-Wert ( 0 gleich jetzt aus Schritt # 3) in die Variable 1
  6. zurück

Nun sollte es ziemlich klar sein, wie count = count++ in Java kompiliert wird.

    
Pablo Santa Cruz 19.05.2012 13:47
quelle
0

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.

    
user195488 04.08.2011 17:20
quelle
0

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.

%Vor%

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.

    
lvijay 04.08.2011 17:48
quelle
-1
%Vor%

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).

    
Ashu Phaugat 20.03.2015 09:36
quelle

Tags und Links