post/pre inkrement oder dekrement

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
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

Aktives Mitglied
hdi hat gesagt.:
Code:
int i = 3;
array[i++] = i;
[...]
Sprich: Bei welchen Syntax-Zeichen passiert so ein Post-Inkrement/Dekrement? Bei ";", bei "=", wo noch?

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:
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

Top Contributor
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?
 

JavaFred

Aktives Mitglied
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.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
hdi Verständnisfrage zu Zuweisung + Post-Inkrement Java Basics - Anfänger-Themen 3
F POST-Request mit json - Abfrage mit Java Java Basics - Anfänger-Themen 2
K Eigene Annotations, Pre-/Post-/Call-Method Java Basics - Anfänger-Themen 6
B Input/Output HttpURLConnection ( java.net ) Post request Java Basics - Anfänger-Themen 8
N Unterschied von Post- und Preinkrement Java Basics - Anfänger-Themen 3
F Http Post von mehreren Daten Java Basics - Anfänger-Themen 5
N Daten/Formular per POST an Firefox/Browser senden Java Basics - Anfänger-Themen 7
X Kann man post increment "vollständig schreiben"? Java Basics - Anfänger-Themen 13
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
R Daten via Post an php Script senden Java Basics - Anfänger-Themen 1
A ein observer "post"problem Java Basics - Anfänger-Themen 3
J Funktion um JSON per Post senden/emfangen Java Basics - Anfänger-Themen 3
J Html zugriff - POST Request/Response Java Basics - Anfänger-Themen 4
B JavaSkript Form-Tag Value & Post Java Basics - Anfänger-Themen 6
C Versandmarken Post Java Basics - Anfänger-Themen 3
N URLConnection Post Login Java Basics - Anfänger-Themen 8
P Java POST an PHP und lesen Java Basics - Anfänger-Themen 5
G Daten per post Java Basics - Anfänger-Themen 3
C HTTP POST-Request Java Basics - Anfänger-Themen 3
R von Applet zu html/php und post variablen mitschicken Java Basics - Anfänger-Themen 3
G POST-Daten Java Basics - Anfänger-Themen 5
G Post-und Präinkrement Schreibweise Java Basics - Anfänger-Themen 4
V Post-Methode und HTTPClient ? Java Basics - Anfänger-Themen 3
O Post senden an php script. Java Basics - Anfänger-Themen 20
G Post-Methode senden Java Basics - Anfänger-Themen 4
B Inkrement von Variable Java Basics - Anfänger-Themen 8
D Prä-Inkrement, ++i Java Basics - Anfänger-Themen 7
V Inkrement funktioniert nicht Java Basics - Anfänger-Themen 2
V Inkrement funktioniert nicht Java Basics - Anfänger-Themen 1
V Erste Schritte Habe Fragen zu der For und While Schleife als auch Inkrement und Dekrement Java Basics - Anfänger-Themen 4
Q Operatoren inkrement der Division ? Java Basics - Anfänger-Themen 16
L Erste Schritte Fragen zu Arrays, Inkrement Operatoren, Dekrement Operatoren ? Java Basics - Anfänger-Themen 9
Povlsen84 Inkrement Java Basics - Anfänger-Themen 7
S Java 5 for schleife wie doppelter inkrement? Java Basics - Anfänger-Themen 11
A Dekrement/Inkrement Java Basics - Anfänger-Themen 11
K inkrement Java Basics - Anfänger-Themen 3
N Was is Inkrement Dekrement Java Basics - Anfänger-Themen 2
J Dekrement läuft offenbar falsch Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben