Wie kann man bei BlueJ (Java) eine if-Anweisung schreiben, die nur geht, wenn z.B. boolean x = true ist?

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

MarcoBest28 
Fragesteller
 03.11.2017, 16:39

Danke!

1