PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warum kompiliert der Ausdruck? (Java)


Gast
2009-12-05, 09:23:56
Welchen Wert hat die Variable "x" am Ende der Zuweisungen?

int x = 10;
int y = 20;

x = x < y ? y++ : ++y;

Angeblich richtige Antwort: 20.

Meiner Meinung nach kompiliert das so nicht. "x < y" ergibt einen booleschen Wert (hier: true). Der lässt sich aber nicht an x zuweisen, wenn x den Datentyp int besitzt (und casten von oder nach boolean geht sowieso nicht, was hier aber auch nicht gemacht wurde).

robobimbo
2009-12-05, 09:27:58
das bool ist ja nicht der rückgabewert des ternary-operators, sondern es ist - je nach ergebnis der bedingung - entweder das ergebnis von y++ oder von +yy. Nachdem dem beide Zweige dieses "If"s int zurückliefen ist es ein gültiger Ausdruck.

stell es dir vor als


int x=10;
int y=20;

if (x < y) {
x = y++;
} else {
x = ++y;
}

Gast
2009-12-05, 09:33:41
das bool ist ja nicht der rückgabewert des ternary-operators, sondern es ist - je nach ergebnis der bedingung - entweder das ergebnis von y++ oder von +yy.

x ? y : z bedeutet:

x muss boolean sein. Wenn x = true, dann y. Wenn x = false, dann z. Das ist mir klar. Nun steht da aber ein "int x = true"???

Monger
2009-12-05, 09:34:37
Diese Konstruktion " ... ? ... : ..." ist eine If Bedingung.

Was da also steht, ist: "Wenn x kleiner als y ist, dann y++, ansonsten ++y.

Da eine Zuweisung von einem Postinkrement gar nix bringt (der Inkrement wird dann erst nach der Zuweisung durchgeführt, aber eben auf der falschen Zahl), bleibt es deshalb bei 20.

Gast
2009-12-05, 09:37:01
Diese Konstruktion " ... ? ... : ..." ist eine If Bedingung.

Was da also steht, ist: "Wenn x kleiner als y ist, dann y++, ansonsten ++y.

Da eine Zuweisung von einem Postinkrement gar nix bringt (der Inkrement wird dann erst nach der Zuweisung durchgeführt, aber eben auf der falschen Zahl), bleibt es deshalb bei 20.

Ich weiß, was der Fragezeichenoperator macht. :D Das Problem ist, dass das x vom Datentyp integer ist. Dem kann ich dann nicht einfach einen booleschen Ausdruck zuweisen. :freak:

Gast
2009-12-05, 09:41:15
Ich weiß, was der Fragezeichenoperator macht. :D
Nein, offensichtlich weißt du das nicht
Das Problem ist, dass das x vom Datentyp integer ist. Dem kann ich dann nicht einfach einen booleschen Ausdruck zuweisen. :freak:
siehe oben...

RTFM!

Monger
2009-12-05, 09:41:15
x < y ist natürlich ein booleescher Ausdruck. Entweder ist x kleiner als y, oder eben nicht. In dem Fall ist der Ausdruck eben true.

Gast
2009-12-05, 09:45:45
x < y ist natürlich ein booleescher Ausdruck. Entweder ist x kleiner als y, oder eben nicht. In dem Fall ist der Ausdruck eben true.

Ja, richtig. x < y liefert den booleschen Wert true. DER wird nun an x zugewiesen.

"x = x < y."

Das x ganz links ist aber vorher als int deklariert worden. Verstehste mein Problem jetzt? Das fett markierte ist ja klar. :D

Gast
2009-12-05, 09:47:45
int x = 10;
int y = 20;

x = x < y ? y++ : ++y;

Mal markiert, was ich meine.

Gast
2009-12-05, 09:54:50
Da steht ja quasi sowas wie:

int x = 10;
boolean y;

x = y;

;(

Monger
2009-12-05, 09:55:47
Ja, richtig. x < y liefert den booleschen Wert true. DER wird nun an x zugewiesen.

Nein, wird er nicht. Ausdrücke werden grundsätzlich von rechts nach links ausgewertet. Die Zuweisung passiert erst ganz zuletzt. Was im einzelnen also Schritt für Schritt passiert, ist:

x = x < y ? y++ : ++y;

x = true ? y++ : ++y

x = y++

x = 20++

Und da wie gesagt ein Postinkrement erst NACH der Zuweisung passiert (das ist halt die Ausnahme von der Regel), ist x eben 20.

Gast
2009-12-05, 09:57:12
Ahhh, ok, ich hätte die Präzedenztabelle zur Hand nehmen sollen. Der Zuweisungsoperator hat ja die geringste Priorität. Vielen Dank. :usad: