# post/pre inkrement oder dekrement



## hdi (2. Feb 2008)

hey, habe eine verständnisfrage, denn mich hat grad was überrascht. 

der unterschied zwischen post- und prä-inkrement bzw. dekrement besteht, _dachte ich_, darin, dass bei post-x der
wert erst dann erhöht wird, wenn ein statement abgeschlossen wurde.
also nach einem ";"

aber:

int i = 3;
array[i++] = i;

hier hat jetzt das array an der stelle 3 den Wert 4 !!

Also wird der Wert schon VOR dem ";" erhöht, obwohl es sich um ein post-inkrement handelt, und kein prä-inkrement.
das "=" macht also das inkrement scheinbar auch schon gültig?
gibt es noch ein paar fälle, wo das so ist?

Sprich: Bei welchen Syntax-Zeichen passiert so ein Post-Inkrement/Dekrement? Bei ";", bei "=", wo noch?

danke


----------



## Triebi (2. Feb 2008)

hdi hat gesagt.:
			
		

> ```
> int i = 3;
> array[i++] = i;
> ```
> ...



Es wird da durchgeführt, wo es auftaucht.
Bei diesem Beispiel schaut das so aus:
1) Es wird festgestellt, dass auf array_, also array[3] zugegriffen werden soll
2) i wird *danach* inkrementiert -> i == 4
3) i wird dem in 1 festgelegten Arrayindex [3] zugewiesen



		Code:In die Zwischenablage kopieren


int i = 3;
array[++i] = i;

Wäre dann
1) i wird *vorher* inkrementiert
2) Es wird festgestellt, dass auf array, jetzt also array[4] zugegriffen werden soll
3) i wird dem in 2 festgelegten Arrayindex [4] zugewiesen_


----------



## hdi (2. Feb 2008)

ja, schon klar, das hab ich ja jetzt selber gesehen.

die frage ist nur: wann setzt der compiler ein *post*-inkrement oder *post*-dekrement um?

wir hatten es eben so gelernt, dass der wert erst nach dem nächsten statement-ende ";" geändert wird.

aber scheinbar auch bei einem "=" zeichen.

die frage war jetzt: wann noch? oder gibt es nur diese 2 syntax-zeichen, nach denen der compiler den wert erhöht?


----------



## Triebi (2. Feb 2008)

Es gibt eine festgelegte Reihenfolge, in der Operatoren ausgewertet werden. Hier der obligatorische Link zur Javainsel: http://www.galileocomputing.de/open...02_004.htm#mj6d41b4137cb31225bc3897f288b1da55
Was oben steht, kommt zuerst dran, das untere später.


----------



## JavaFred (3. Feb 2008)

hdi hat gesagt.:
			
		

> wir hatten es eben so gelernt, dass der wert erst nach dem nächsten statement-ende ";" geändert wird.


Das ist falsch. Werte kann man gar nicht verändern, aber das ist nur eine sprachliche Unsauberkeit - ein "Flüchtigkeitsfehler".

Zunächst muss man folgendes verstehen: "i++" ist ein Ausdruck. Wie jeder andere Ausdruck auch wird dieser zur Laufzeit zu einem Wert *ausgewertet*. Das besondere an "i++" ist nun aber, dass dieser Ausdruck einen *Seiteneffekt* hat: die Variable i bekommt einen neuen Wert, welcher um 1 größer ist als der alte Wert. *Dieser Seiteneffekt tritt sofort ein.* Trotzdem ist der Wert des Ausdrucks "i++" der Wert vor der Erhöhung.

Die genaue Semantik von i++ kann man sich so vorstellen:
- t = i
- i = i + 1
- return t

Man merkt sich also den momentanen Wert in einer neuen, unsichtbaren Variable. Dann erhöht man i und gibt anschließend den Wert der unsichtbaren Variable zurück, also den Wert vor der Erhöhung. *Trotzdem ist i jetzt bereits erhöht!*

Nun zu Deinem eigentlichen Problem: array[i++] = i. Wir haben es hier mit einer Zuweisung zu tun, die durch den Zuweisungsoperator = realisiert ist. Bei allen binären Operatoren wird zuerst der linke Operand (hier array[i++]) und anschließend der rechte Operand (hier i) ausgewertet. Das kannst Du hier nachlesen.

Da der Seiteneffekt von i++ unmittelbar beim Auswerten der linken Seite der Zuweisung eintritt, ist der Wert von i auf der rechten Seite der Zuweisung bereits um 1 höher. Das steht auch in der JLS als Erläuterung:


> The left-hand operand of a binary operator appears to be fully evaluated before any part of the right-hand operand is evaluated. For example, if the left-hand operand contains an assignment to a variable and the right-hand operand contains a reference to that same variable, then the value produced by the reference will reflect the fact that the assignment occurred first.


----------

