# Postinkrement-Verständnisproblem



## aha! (26. Jan 2010)

Guten Abend zusammen,

ich spiele hier gerade ein wenig mit post- und pre- inkrement und dekrement rum.
Soweit eigentlich alles klar. Nur habe ich jetzt folgendes Verständnis-Problem.
Sei mal folgendes gegeben:


```
public class Test {
	public static void main(String[] args) {
		int a = 5;
		System.out.println(a); // 5
		a=a++;
		System.out.println(a); // 5

		int b = 5;
		System.out.println(b); // 5
		b++;
		System.out.println(b); // 6 ??
	}
}
```

a=a++ ist klar. Der Wert 5 wird dem a zugewiesen. a würde erst bei der nächstem Aufruf 6 sein.
b erhält den Wert 5. Dann folgt b++. Also sollte doch b bei nächster Verarbeitung erst um eins inkrementiert werden, oder nicht? Warum erhalte ich bei der drittletzten Zeile dann doch eine 6?

Oder besser gefragt: Worin unterscheidet sich "x=x++" mit "x++"?

Ich glaub' ich steh grad mächtig auf dem Schlauch :-/


----------



## Lexi (26. Jan 2010)

Also ein a++ wird eigentlich in ein a = a + 1 übersetzt.

Und bei einem a = a++ wird wohl erst der aktuelle Wert von a dem a zugewiesen ( bleibt also gleich ) und danach wird der Wert von a um eins erhöht. Würde ich sagen.


----------



## ThreadPool (26. Jan 2010)

aha! hat gesagt.:


> Guten Abend zusammen,
> 
> inkrementiert werden, oder nicht? Warum erhalte ich bei der drittletzten Zeile dann doch eine 6?
> 
> Oder besser gefragt: Worin unterscheidet sich "x=x++" mit "x++"?



Weil b da schon verwendet wurde, effektiv steht in deinem Code sowas wie

b = b +1;

Schreib mal

```
int b = 5;
System.out.println(b++);
System.out.println(b);
```


----------



## aha! (26. Jan 2010)

Lexi hat gesagt.:


> Also ein a++ wird eigentlich in ein a = a + 1 übersetzt.
> 
> Und bei einem a = a++ wird wohl erst der aktuelle Wert von a dem a zugewiesen ( bleibt also gleich ) und danach wird der Wert von a um eins erhöht. Würde ich sagen.



Danke für die schnelle Antwort erstmal 
wenn a++ das gleiche ist wie a=a+1, dann würde sich ja a sofort(!) um 1 erhöhen. Quasi noch in der selben Zeile. Aber hier wird ja postinkrementiert.


----------



## eRaaaa (26. Jan 2010)

```
a=a++;
```

a wird sich intern gemerkt. Es passiert also folgendes
1) merke dir den Wert des a auf der rechten Seite  = 5;
2) inkrementiere das a auf der rechten Seite
3) setze a = den gemerkten Wert

Dadurch ändert sich nichts und a bleibt bei 5

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 2.5 Ausdrücke, Operanden und Operatoren

(bisschen scrollen zu Einige Kuriositäten )


----------



## ThreadPool (26. Jan 2010)

aha! hat gesagt.:


> Danke für die schnelle Antwort erstmal
> wenn a++ das gleiche ist wie a=a+1, dann würde sich ja a sofort(!) um 1 erhöhen. Quasi noch in der selben Zeile. Aber hier wird ja postinkrementiert.



probier Folgendes

```
int a = 5;
        System.out.println(a); // 5
        a=a++;
        System.out.println(a); // 5
        System.out.println(a); // ?
```


----------



## aha! (26. Jan 2010)

ThreadPool hat gesagt.:


> Weil b da schon verwendet wurde, effektiv steht in deinem Code sowas wie
> 
> b = b +1;
> 
> ...



Eben. Das war auch mein Gedanke. b wird in deinem Beispiel auch in der dritten Zeile "verwendet", also um 1 erhöht und ausgegeben. Aber dann müsste der selbe Effekt in meiner Zeile 6 auch geschehen, oder nicht?


----------



## ThreadPool (26. Jan 2010)

aha! hat gesagt.:


> Aber dann müsste der selbe Effekt in meiner Zeile 6 auch geschehen, oder nicht?



Nein, siehe Post von eRaaa....

Falls du damit noch Schwierigkeiten hast, die passende Passage von Sun zu dem Thema findet sich
unter Expressions

Wichtig ist folgender Satz:



> The value of the postfix increment expression is the value of the variable before the new
> value is stored.


----------



## aha! (26. Jan 2010)

eRaaaa hat gesagt.:


> ```
> a=a++;
> ```
> 
> ...




bei 2) "erkennt" Java quasi, dass das a in der selben Zeile "verwendet" wird (Zuweisung) und inkrementiert. Anschließend wird aber der ursprüngliche Wert auf a gesetzt.
Logisch eigentlich, weil die Erkennung ja immer vor der Rechnung kommt. Wie bei println ja auch.

Dickes Brot! Aber ich hab's verstanden.
Ich danke vielmals!!


----------



## Marco13 (26. Jan 2010)

Und die Quintessenz: Sowas wie
a = a++;
sollte man nicht schreiben. (<-Punkt)


----------



## aha! (26. Jan 2010)

Marco13 hat gesagt.:


> Und die Quintessenz: Sowas wie
> a = a++;
> sollte man nicht schreiben. (<-Punkt)



Himmel, ich werde mich hüten!
Wie gesagt, habe nur ein wenig damit rumgespielt. Das ist dabei rausgekommen und ich wollt' es nur verstehen ;-)


----------



## Lirave (27. Jan 2010)

aber bei b = a++ ist es sinvoll

```
int a,b;
a = 5;
b = a*a++;  
System.out.println(a+" "+b);
```



> 6 25



aber geht ja auch mit zwei Befehlen


----------



## Marco13 (27. Jan 2010)

Über Sinn und Unsinn kann man sich streiten. Es bringt keinen echten Vorteil, aber die gravierenden Nachteile geringerer Übersichtlichkeit und potentieller Verwirrung und Unsicherheit, was genau dort passiert.


----------

