Postinkrement und println - Verständnisproblem

CodeIsland

Mitglied
Hallo!

Ich schreibe bald Klausur und hänge schon ewig an dieser einen Übungsaufgabe mit den Inkrementoperatoren. Kann mir jemand sagen, wo mein Denkfehler ist? Danke im Voraus!

Java:
        int b = 2;
	b = b++;
	System.out.println(b);//Ich denke Ausgabe ist 3, Wert von b wird durch b++ um 1 erhöht 
und mit der nächsten Ausgabe in println auch auf 3 gesetzt ausgegeben -> aber nein -> Ausgabe ist 2!
	System.out.println(++b);////Ich denke Ausgabe ist 4, denn jetzt wird der vorherige Wert 
sofort erhöht -> aber nein -> Ausgabe ist 3!
 
Bei der ersten Aufgabe wird zuerst b auf den Stack gelegt. Dann wird b noch einmal auf den Stack gelegt und der der zuletzt auf den Stack gelegte Wert wird mit dem davor überschrieben. Dann wird der Wert davor inkrementiert, aber das ist egal, weil der verfällt. Oder so ähnlich. Die Begründung ist nicht richtig aber so ähnlich ist es.

Der vorige Wert wird sofort erhöht. Der ist aber 2 😉


Dies ist der Bytecode dazu. Vielleicht hilft dir das etwas:

Java:
  private void operatorenTest();
    Code:
       0: iconst_2      
       1: istore_1      
       2: iload_1       
       3: iinc          1, 1
       6: istore_1      
       7: getstatic     #74                 // Field java/lang/System.out:Ljava/io/PrintStream;
      10: iload_1       
      11: invokevirtual #113                // Method java/io/PrintStream.println:(I)V
      14: return
 
Zuletzt bearbeitet:
Java:
////Ich denke Ausgabe ist 4, denn jetzt wird der vorherige Wert sofort erhöht -> aber nein -> Ausgabe ist 3!

Das ist nur ein Folgefehler. In diesem Fall hast du natürlich recht mit deiner Beschreibung: Der Wert von "b" wird sofort erhöht, es kommt aber 3 raus da der Ausgangswert nur 2 war und nicht 3.

Zu der Zeile "b = b++;" gibt es hier teilweise Erklärungen Post increment and the assignment operator (Java in General forum at JavaRanch)
Welche davon wirklich die richtige ist kann ich dir leider nicht genau sagen.
 
Also Pre- sowie Postinkrement erhöht den Wert der Variable immer um 1. Der Unterschied liegt darin, welcher Wert aus dieser Operation hervorgeht. Hier mal ein hoffentlich etwas verständlicheres Beispiel:
Java:
a = 3
b = 3
c = ++a
d = b++
Also a und b sind zunächst gleich 3. Nun wird a durch "++a" auf 4 erhöht. Der Wert der Operation, also das was danach in c gespeichert wird, ist auch 4. Der Postinkrement-Operator arbeitet aber anders. Zunächst erhöht er den Wert von b auch auf 4. Der Wert der Operation, also das was danach in d gespeichert wird, ist aber der vorherige Wert nämlich 3. Somit ist am Ende a = b = c = 4 und d = 3.
Ob also "++x" oder "x++" berechnet wird, spielt für die Variable x erstmal keine Rolle. Es kommt drauf an, was man mit dieser Operation weiterhin macht, also ob man den Wert dieser Operation in einer Variablen speichert.

Nun zu deinem Beispiel. Die Variable b ist am Anfang 2. Dann wird sie mit "b++" um eins erhöht. Das heißt für diesen kurzen Moment hat sie den Wert 3. Der Wert des Postinkrements ist aber der alte Wert 2 und wird danach in die Variable b gespeichert. Also ist die erste Ausgabe 2. In der letzten Zeile wird b mit "++b" um eins erhöht. Also hat b den Wert 3. Da nicht b ausgegeben wird, sondern "++b" muss man hier nochmal kurz drüber nachdenken. Da es hier aber um den Preinkrement-Operator handelt, stimmt der Wert, der ausgeben wird, mit dem von b überein, also 3.
Wenn die letzte Zeile stattdessen "System.out.println(b++);" gelauten hätte, wäre die zweite Ausgabe wieder 2 gewesen, auch wenn b danach den Wert 3 gehabt hätte.

lg Kevin
 
Zuletzt bearbeitet:
Java:
b = 3
d = b++
Also a und b sind zunächst gleich 3. Nun wird a durch "++a" auf 4 erhöht. Der Wert der Operation, also das was danach in c gespeichert wird, ist auch 4. Der Postinkrement-Operator arbeitet aber anders. Zunächst erhöht er den Wert von b auch auf 4. Der Wert der Operation, also das was danach in d gespeichert wird, ist aber der vorherige Wert nämlich 3. Somit ist am Ende a = b = c = 4 und d = 3.
Ob also "++x" oder "x++" berechnet wird, spielt für die Variable x erstmal keine Rolle. Es kommt drauf an, was man mit dieser Operation weiterhin macht, also ob man den Wert dieser Operation in einer Variablen speichert.

Die Erklärung stimmt zwar aber dein Beispiel entspricht nicht ganz dem des TO. Daher erklärt es nicht ganz das Verhalten des Beispiels vom TO
Er weist der Variable die inkrementiert wird sich selber zu! => "b = b++;"

Habe mich gerade erkundigt:

b = 3;
Bei dem Code "b = b++;" wird zuerst evaluiert welcher Wert "b" zugewiesen werden soll.
In diesem Fall ist der evaluierte Wert "3", dann wird b inkrementiert und hat den Wert 4. Erst dann passiert die Zuweisung des evaluierten Wertes "3" wird "b" zugewiesen

=> daher hat "b" nun den Wert "3"


Kurz zusammengefasst: Das Inkrement wird zwischen Evaluierung und Zuweisung durchgeführt und geht daher "verloren"
 
Zuletzt bearbeitet:
Hast du mein kompletten Post überhaupt gelesen? Ich wollte in einem anderen Beispiel erstmal auf den Unterschied zwischen Pre und Postink. hinweisen. Da hab ich im übrigen auch schon erwähnt, in welcher Reihenfolge die Auswertung stattfindet. Im zweiten Abschnitt geh ich doch auf das Beispiel des TO ein.
 
Hast du mein kompletten Post überhaupt gelesen?

Ja habe ich. Aber wahrscheinlich wichtige Teile fälschlicher Weise ausgeblendet 😉

Ich wollte in einem anderen Beispiel erstmal auf den Unterschied zwischen Pre und Postink. hinweisen. Da hab ich im übrigen auch schon erwähnt, in welcher Reihenfolge die Auswertung stattfindet. Im zweiten Abschnitt geh ich doch auf das Beispiel des TO ein.

Jetzt seh ichs auch, komisch das es mir vorhin anders vorkam :bahnhof:
 
Falls du weitere Fragen hast kannst du gerne fragen, ich vermute stark du meinst die EIP Klausur oder? 😉

Ahja, die Erläuterung von CSHW89 bringt's genau auf den Punkt - alles korrekt, genau so wurde es auch in der Vorlesung formuliert.

cheers
 
Zuletzt bearbeitet:

Zurück
Oben