Zuweisungen - Reihenfolge

Status
Nicht offen für weitere Antworten.

UdoKessler

Mitglied
Hallo zusammen,

habe eine kleine Frage zu Zuweisungen:

Code:
int x = 10; y = 10;
x+= y+= x+= y;

Bei dieser Zuweisung wird ja von rechts nach links gelöst, da alle
Operatoren die gleiche Rangordnung haben (nur "+").

Als Ergebnis hätte ich x=50 und y = 30 erwartet, weil ich die Berechnung so vermutet
hab: (v.r.n.l.) x10+y10 (x=20, y=10); y10+x20 (x=20, y=30); x20+y30 (x=50, y=30)

Als Endergebnis also x=50, y=30.
Es kommt aber für x 40 raus.
Wieso?

Gruß
Udo
 

fjord

Bekanntes Mitglied
[highlight=java]public static void main(String[] args) {
int x = 10;
int y = 10;
x+= y+= x+= y;
}[/highlight]

sieht nach dem compilieren so aus:

Code:
public static void main(java.lang.String[]);
  Code:
   0:   bipush  10
   2:   istore_1
   3:   bipush  10
   5:   istore_2
   6:   iload_1
   7:   iload_2
   8:   iload_1
   9:   iload_2
   10:  iadd
   11:  dup
   12:  istore_1
   13:  iadd
   14:  dup
   15:  istore_2
   16:  iadd
   17:  istore_1
   18:  return
Das heißt die Werte werden von links nach rechts auf den Stack gepushed und dann von rechts nach links ausgewertet.
Reicht das schon als Erklärung, oder willst du genauer wissen was die JVM da macht?
 

FatFire

Bekanntes Mitglied
Puh, also, ohne mir ganz sicher zu sein, schätze ich mal, dass da irgendwas im Cache gehalten wird, und ansonsten einfach aus dem Speicher nachgeladen wird...also, es darf nur eine Version von x und y gleichzeitig im Cache sein, und nur was am Ende im Cache liegt, wird auch in den normalen Speicher zurückgeschrieben. Stelle mir das ungefähr so vor:

X und Y werden jeweils mit 10 in den Cache geholt.
Y wird auf X addiert, also X mit 20 im Cache. Da die nächste Operation auch mit X, bleibt 20 im Cache und Y wird mit 10 aus dem Speicher geholt. Dort werden die 20 aufaddiert.
Nächste Operation werden die 30 von Y im Cache gehalten, das X wird aber aus dem Speicher geholt, da die Operation immer noch nicht beendet und zugewiesen wurde. Deshalb werden nur 10 bei X mitgenommen und die 30 aufaddiert. Wenn man also jetzt das Spiel noch einmal treiben würde, hätten wir die 40 von X im Cache, Y wird nachgeladen (immer noch nur 10), demzufolge im nächsten Schritt 50 für Y. Erst wenn die Operation komplett beendet ist, werden die Werte für X und Y in den Speicher geschrieben und die Änderung somit dauerhaft festgelegt.

Einer der Gründe warum Zuweisungsoperationen immer molekular sein sollten.

Edit: @fjord: Streber :bae:
 
S

SlaterB

Gast
> Erst wenn die Operation komplett beendet ist, werden die Werte für X und Y in den Speicher geschrieben und die Änderung somit dauerhaft festgelegt.

nicht ganz, siehe auch Beispiel

int x = 0;
int y = 10;
x = (y += 5) + (y * 1000);
System.out.println("x " + x + ", " + y);

Auswertung von links nach rechts ist der Schlüssel, je linker eine Variable steht, desto älter ist ihr Wert ;)

und bei
x +=
kann man sich
x = x + ..
denken, das erste x rechts wird dann der ursprüngliche Wert sein
 

FatFire

Bekanntes Mitglied
Naja, aber für einen Schuss ins Blaue schon ein guter Erklärungsversuch. Ich hatte meinen Beitrag ja zeitgleich zu Fjord verfasst, hab mir aber noch nie die Mühe gemacht, mal wirklich in den Bytecode zu schauen. Hätte ich bei der Fragestellung aber vielleicht doch gleich mal tun sollen, jetzt ist es natürlich viel klarer :oops:
 

UdoKessler

Mitglied
Danke für eure Antworten!
Hab verstanden und mein Verdacht (nach etwas grübelei) ging auch
in die Richtung.

@fjord
Deine Auflistung hast Du aus dem Bytecode, oder wie lässt Du Dir
das anzeigen?
Nein, eine genauere Erklärung ist nicht nötig, danke!


Gruß
Udo
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Zuweisungen und Methodenaufrufe in Bedingung der while Schleife? Java Basics - Anfänger-Themen 2
Y Zuweisungen Java Basics - Anfänger-Themen 4
A Zuweisungen und -- operator; Java Basics - Anfänger-Themen 2
V Frage zu Zuweisungen Java Basics - Anfänger-Themen 11
S Tastatur zuweisungen Java Basics - Anfänger-Themen 3
S Problem mit Zuweisungen Java Basics - Anfänger-Themen 5
G Zählen von Zuweisungen bei Bubble Sort Java Basics - Anfänger-Themen 3
G Boolean Zuweisungen Java Basics - Anfänger-Themen 6
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
J Methoden Die Reihenfolge der Iterator-Elemente umkehren Java Basics - Anfänger-Themen 3
R While-Loop der die Einträge eines Arrays in umgekehrter Reihenfolge anzeigt Java Basics - Anfänger-Themen 3
D Array Elemente sortieren in aufsteigender Reihenfolge Java Basics - Anfänger-Themen 10
D Methoden nach einer bestimmten Reihenfolge ausführen. Java Basics - Anfänger-Themen 20
I Array in umgekehrter Reihenfolge - Erklärung - Java Basics - Anfänger-Themen 3
R Werte und Reihenfolge in 2d Arrays vergleichen Java Basics - Anfänger-Themen 5
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
M Feste Reihenfolge von dem Ablauf von Methoden Java Basics - Anfänger-Themen 7
H Knoten-Reihenfolge einer LinkedList invertieren Java Basics - Anfänger-Themen 11
L Richtige Reihenfolge der Dateien Java Basics - Anfänger-Themen 5
C Werte im Vector in zufällige Reihenfolge bringen Java Basics - Anfänger-Themen 14
C Vector-Inhalt in zufällige Reihenfolge bringen Java Basics - Anfänger-Themen 6
A String in umgekehrter Reihenfolge ausgeben Java Basics - Anfänger-Themen 7
L Reihenfolge Ausgabe Java Basics - Anfänger-Themen 5
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
D TAB Reihenfolge im JSinner Java Basics - Anfänger-Themen 1
RowdyN Methoden Befehle in zufälliger Reihenfolge ausführen lassen Java Basics - Anfänger-Themen 5
B Arrays in Reihenfolge vertauschen Java Basics - Anfänger-Themen 6
J Reihenfolge im Vector lässt sich nicht drehen Java Basics - Anfänger-Themen 9
M Array Reihenfolge umdrehen Java Basics - Anfänger-Themen 9
J Klassen Reihenfolge beim Aufruf von Klassen Java Basics - Anfänger-Themen 1
L zweidimensionales char array reihenfolge ändern ? Java Basics - Anfänger-Themen 2
S Warum muss ich die operationen mit AffineTransform in umgekehrter Reihenfolge ausfuehren..? Java Basics - Anfänger-Themen 4
M Reihenfolge von Testmethoden in JUnit beeinflussen Java Basics - Anfänger-Themen 2
M Ausgabe in falscher Reihenfolge Java Basics - Anfänger-Themen 7
S Vokal Reihenfolge Java Basics - Anfänger-Themen 1
C if Reihenfolge Java Basics - Anfänger-Themen 2
W String von hinten alle drei Zeichen abschneiden und in umgekehrter Reihenfolge ausgeben. Java Basics - Anfänger-Themen 9
F Reihenfolge des Quelltexts Java Basics - Anfänger-Themen 6
S Jede Reihenfolge einer zufällig langen Liste ausprobieren Java Basics - Anfänger-Themen 3
B AffineTransform - Reihenfolge der Operationen Java Basics - Anfänger-Themen 3
B Methoden Logische Reihenfolge in Programmen? Java Basics - Anfänger-Themen 4
D Problem mit Initialisierung und Reihenfolge Java Basics - Anfänger-Themen 10
O Zwingende Reihenfolge von Methoden Java Basics - Anfänger-Themen 33
P Vereinfachte for-Schleife wird in umgekehrter Reihenfolge ausgewertet Java Basics - Anfänger-Themen 7
X Collections Reihenfolge bestimmter Objekte in einer ArrayList verändern Java Basics - Anfänger-Themen 2
S Buttons übereinander legen - Reihenfolge Java Basics - Anfänger-Themen 2
G Zahlen in zufälliger Reihenfolge ausgeben/speichern. Java Basics - Anfänger-Themen 2
R Reihenfolge im Konstruktor der Objekte Java Basics - Anfänger-Themen 13
L Properties Reihenfolge vorgeben Java Basics - Anfänger-Themen 13
N Reihenfolge von Methoden Java Basics - Anfänger-Themen 5
F Reihenfolge in der Events abgearbeitet werden Java Basics - Anfänger-Themen 2
A Wörter umgekehrten Reihenfolge ausgeben Java Basics - Anfänger-Themen 3
A Reihenfolge bei equals() Java Basics - Anfänger-Themen 2
K Reihenfolge Modifikatoren Java Basics - Anfänger-Themen 6
S Falsche Reihenfolge von Methodenaufrufen Java Basics - Anfänger-Themen 8
G Array Reihenfolge ändern Java Basics - Anfänger-Themen 6
M Reihenfolge von Objekten im Vektor Java Basics - Anfänger-Themen 3
A Liste von Listen mit fester reihenfolge Java Basics - Anfänger-Themen 6
P Frage zu OO (Reihenfolge der Klassen) Java Basics - Anfänger-Themen 2
G Feld in umgekehrter Reihenfolge an zweites Feld übergeben Java Basics - Anfänger-Themen 5
T Reihenfolge von Strings prüfen Java Basics - Anfänger-Themen 3
B Stack mit Strings in zufälliger Reihenfolge füllen Java Basics - Anfänger-Themen 4
K Array umgedrehte Reihenfolge Java Basics - Anfänger-Themen 2
M String Reihenfolge umkehren Java Basics - Anfänger-Themen 2
M Array anders sortieren, aber die Reihenfolge beibehalten Java Basics - Anfänger-Themen 4
V Reihenfolge von Befehlen - hier repaint() zu spät Java Basics - Anfänger-Themen 13
N Zahlen einlesen und in umgekehrter Reihenfolge ausgeben Java Basics - Anfänger-Themen 5
D Array in umgekehrter Reihenfolge Java Basics - Anfänger-Themen 4
A Reihenfolge erfassen Java Basics - Anfänger-Themen 11
A String Zeichen löschen in einer bestimmten Reihenfolge Java Basics - Anfänger-Themen 25
G Zahlen in umgekehrter Reihenfolge ausgeben Java Basics - Anfänger-Themen 6
A Exception Reihenfolge Java Basics - Anfänger-Themen 3
M Sorry,ne blöde Frage Focus setzen und Focus Reihenfolge Java Basics - Anfänger-Themen 15
L Reihenfolge der Methodenaufrufe Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben