int a = 5;
int b = a + a++;
System.out.println(b); //Ausgabe: 10
Das verstehe ich überhaupt nicht, nach Tabelle muss doch “int b = a + a++” äquivalent zu “int b = 6 + 5 = 11” sein…
In einem Java-Buch steht, dass Operanden von links nach rechts ausgewertet werden, aber z.B. “b = 5 + 5 * 8” wird ja auch nicht von links nach rechts ausgwertet…?!
Nicht ganz. Das hat aber auch mit der „Bewertungsreihenfolge“ nicht zu tun, sondern mit dem pre bzw. post increment Operator.
Mit a++ wird a NACH bearbeiten der Operation inkrementiert.
Mit ++a wird a VOR bearbeiten der Operation inkrementert.
In deinem Code wird also int b = 5 + 5 gerechnet. Erst im nächsten Schritt ist a dann 6.
Es besteht ein Unterschied zwischen a++ und ++a. Damit b 11 ergibt, müsstest du ++a verwenden. In deinem Fall wird erst der Wert von a zurückgegeben und dann incrementiert. Bei ++a wird erst incrementiert und dann der Wert zurückgegeben. Hier nochmal ein Beispiel was das verdeutlichen soll:
int a = 5;
int b = a + a++ + a;
System.out.println(b);
Hier kommt eben 16 raus, denn rechnen tut Java hier: 5 + 5 [wert von a um 1 erhöhen] + 6.
Hier greift das ganz normale Punkt vor Strich, wie mans aus der Mathematik kennt. Das von links nach rechts auswerten bezieht sich nur auf Operationen gleichen Ranges, so wie du es auch machen würdest wenn du einen Term vor dir auf nem Blatt Papier hättest
[QUOTE=Tomate_Salat;63180]Es besteht ein Unterschied zwischen a++ und ++a. Damit b 11 ergibt, müsstest du ++a verwenden. In deinem Fall wird erst der Wert von a zurückgegeben und dann incrementiert. Bei ++a wird erst incrementiert und dann der Wert zurückgegeben. Hier nochmal ein Beispiel was das verdeutlichen soll:
Java Code:
[ol]
[li] [/li][li]int a = 5; [/li][li]int b = a + a++ + a; [/li][li] [/li][li]System.out.println(b); [/li][/ol]
Hier kommt eben 16 raus, denn rechnen tut Java hier: 5 + 5 [wert von a um 1 erhöhen] + 6.[/QUOTE]
Danke, für eure Hilfe. Mir war klar, dass ein Unterschied zwischen ++a und a++ besteht. Im obigen Beispiel hätte ich aber jetzt dennoch 6 + 5 + 6 = 17 erwartet. Erst wird a++ analysiert. 5 wird zurückgegeben und dann a um 1 erhöht. Die zwei anderen a haben dann einen Wert von 6.
Warum hat jetzt aber das linke a einen Wert von 5 und das rechte a einen Wert von 6. Es wird ja schleißlich nicht von links nach rechts vorgegangen.
Entschuldigung, dass ich etwas länger brauche, bis ich es verstehe…
Nein, dass a++ ist nicht das erste was ausgewertet wird. Es wird ausgewertet wie er es findet. Er setzt zuerst den Wert für a ein (also 5). Danach findet er den Ausdruck a++. Wie oben beschrieben wird erst der Wert zurückgegeben und dann incrementiert. Also wird hier 5 addiert und a hat den Wert 6. Das nächste a liefert also 6 zurück und unsere Summe ist letztendlich 16.
Aber dann könnte ich ja auch sagen, dass bei „a + a * b“ erst „a + a“ findet und dann das Ganze mit b multipliziert…
Was sagt denn die Tabelle überhaupt aus, wenn doch nach einer anderen Reihenfolge gerechnet wird…
Du musst dir die Operatorrangfolge wie eine Klammerung vorstellen. Das sieht dann so aus: a + a * b = a + (a * b) und a + a++ + a = a + (a++) + a
*** Edit ***
Bzw wenn man es genau nimmt ist das zweite sogar (a + (a++)) + a, wenn man noch die Auswertungsrichtung mit berücksichtigt. Es gibt rechts- und linksassoziative Operatoren, was angibt, ob zuerst das, was rechts vom Operator oder das was links davon steht, ausgewertet wird. Der Additionsoperator ist linksassoziativ, weshalb die Klammerung links beginnt.
Aber selbst bei der Klammerung müsste doch das linke a schon den Wert 6 haben…
Wenn ich “a++ + a++” rechne, dann wird das rechte a ja auch schon um 1 erhöht (Also bei a=5 : “5+6” und nicht “5+5”).:reflect:
Da kommt auch 11 bei raus. Und in a ist hinterher 7 gespeichert.
*** Edit ***
Ok, etwas detaillierter, was genau passiert.
[ol]
[li]das erste a++ wird ausgewertet. Es liefert 5 zurück, a wird dann auf 6 gesetzt[/li][li]das zweite a++ wird ausgewertet (weil es eine hoehere Prioritaet hat als das +), 6 wird zurueckgegeben und a wird auf 7 gesetzt[/li][li]das + wird ausgewertet: 5 + 6 gerechnet, 11 zurueckgegeben[/li][li]in a steht jetzt eine 7[/li][/ol]
Genau so habe ich mir das auch gedacht, wenn da nicht das Beispiel (a + (a++)) + a wäre…
Ich denke halt, dass folgendes passiert:
(1) a++ wird ausgewertet. Es liefert 5 zurück, a wird dan auf 6 gesetzt
(2) Nun wird die Addition (a + (a++)) durchgeführt, wobei nun ja 6 + 5 gerechnet werden muss!!!
(3)…
Interessanter ist übrigens folgendes Beispiel: a + ++a
Das entspricht a + (++a) und wird fuer a = 5 so ausgewertet:
[ol]
[li]das erste a wird ausgewertet => 5 + (++a)[/li][li]der Unterausdruck ++a wird ausgewertet und liefert 6 zurueck => 5 + 6[/li][li]der + Operator wird ausgewertet, 11 wird zurueckgegeben[/li][/ol]
Ah,
ich glaube jetzt hab ichs verstanden!
++a wird also nur vor der Operation (a + ++a) ausgeführt. a und a++ haben die gleiche Prirorität und deswegen wird von links nach rechts vorgegangen. D.h. a wird schon vor a++ ausgewertet und dann wird alles zusammen addiert…
Stimmt so, oder?
Ne, so ganz hast du es noch nicht. Du machst hier aber auch zwei Schritte auf einmal. Bevor irgendwas addiert werden kann, müssen die Werte geholt werden. Bei einem einfachen a gibt er dessen Wert zurück. Bei einem ++a incrementiert er erst die Variable und gibt dann dessen Wert zurück. Bei einem a++ wird erst der Wert zurückgegeben und dann incrementiert. Dabei ist es komplett egal, ob wir uns in einer Rechenoperation oder sonst wo befinden:
int a = 0;
System.out.println(a++); // Ausgabe: 0
System.out.println(++a); // Ausgabe: 2
Gut, dann markiere ich das Thema mal als „gelöst“. Sollten noch weiterhin Unklarheiten zu dem Thema bestehen, darf aber trotzdem noch hier weiter nachgefragt werden
Gemäß der Klammerung, Präzedenz und von link nach rechts wird der Wert eines Ausdrucks bestimmt.
a++ liest/lädt/holt erst den Wert der Variablen und inkrementiert dann, ++a vice versa.
Im Kopf der for-Schleife keinen Einfluss.
Jetzt alle Fragen geklärt?
Zu anneftanz, war lediglich eine alternative Vorgehensweise, Methoden hatte sie noch
nicht und keine Komplettlösung.