Wie kann man bei BlueJ (Java) eine if-Anweisung schreiben, die nur geht, wenn z.B. boolean x = true ist?
Hallo BlueJ-Nützer!
Wie kann ich eine if-Anweisung machen, die nur geht, wenn boolean x = true ist?
Ich dachte es würde so gehen:
if(x = true)
{
........
}
Es funktioniert aber nicht. Wie kann ich das hinkriegen, dass es funktioniert?
6 Antworten
x = true ist eine Wertzuweisung. x == true oder einfach x wäre die logische Abfrage dazu.
Entweder ...
if (x == true) {
...
}
... oder ...
if (x) {
...
}
== Vergleich
= Zuweisung
Bei boolean würde ich keine Vergleichsoperation verwenden.
if (x == true) {
...
}
-->
if (x) {
...
}
... und ...
if (x == false) {
...
}
-->
if (!x) {
...
}
Das erste ist aber auch nicht direkt "falsch" und der JIT optimiert die überflüssige Vergleichsoperation hoffentlich ohnehin wieder heraus.
Ein Vergleich "x = true", wie in älteren Sprachen (z. B. PL1 oder Pascal) ist in Java so nicht möglich, denn das einfache Gleichheitszeichen bedeutet in Java (und allen anderen von C abgeleiteten Sprachen eine Zuweisung.
Auch in PL/1 ist x = true eine Zuweisung, aber dort wird "x = true" innerhalb von Bedingungen (if) immer als Vergleich angesehen. Somit kein Problem.
C-Sprachen, wie auch in Java, können wir jede Zuweisung (hier x = true, sprich "x wird true") auch als Ausdruck ansehen. Somit ist (y = (x = true)) sowohl die Zuweisung "x wird true", wie auch "y wird Resultat von (x wird true)". Der Wert einer Zuweisung (hier x wird true) ist dann aber auch der zugewiesene Wert. Also z. B. "y = x = 5 + 7" bedeutet, dass sowohl x, wie auch y später den Wert 12 haben werden. Ich könnte auch schreiben "y = (x = 5 + 7) + 2"; somit hätte x den Wert 12 aber y den Wert 14. Dies wurde ursprünglich eingeführt, um Initialisierungen zu vereinfachen (a = b = c = d = 0, somit sind alle Variable 0); hat sich aber als Gefahr erwiesen. Ich verwende die Zuweisung als Ausdruck aber lediglich in while-Schleifen, um das Vor- bzw. Nachlesen nur einmal tippen zu müssen.
In Deinem Fall schreibe also:
if(x) {...}
Natürlich ginge (Weil ein Vergleich in Java mit Verdopplung des Gleichheitszeichens geschrieben werden muss) dies auch:
if(x == true) {...}
Doch hier werden zu viele Fehler gemacht, sodass ich allenfalls ein
if(true == x) {...}
noch durchgehen lassen könnte. Generell wird ein "== true" IMMER weggelassen, um den Fehler des Vertippens zu umgehen.
Stell Dir vor, Du willst "x == true" schreiben und vertippst Dich "x = true" (kann Dir auch passieren, wenn Du obiges gut verstanden hast). Nun hast Du nicht nur eine Zuweisung (x wird true) sondern auch noch den Ausdruck ("true"). Der Wert der Variable spielt also gar keine Rolle mehr und ist nach dem Vergleich immer "true".
1. Regel: Konstanten IMMER links:
if(true == x), if (4 == y), if("Meier".equals(name)), ...
2. Regel: Bei Vergleichen mit boolean niemals die Literale "true" bzw. "false" einsetzen, sondern <<direkt unverändert "false/true"-Variable einsetzen>> (DUFTE). In der Literatur als "Gebundenheit boolescher Variable" bekannt. Also
if(x) statt if(true == x)
if(!x) statt if(false == x)
Für weitere "Fallen" siehe hier:
http://www.santis-training.ch/java/pitfalls.php
Dort unter "Vergleich Boole'scher-Ausdrücke" findest Du Deine Problematik.
if (x)
oder
if (x == true)
Wie man halt immer Vergleiche macht..
if (x)
oder
if (x == true)