Java Bedingung
Willemers Informatik-Ecke
Für den Vergleich numerischer Werte gibt es die folgenden Operatoren:

Operator Bedeutung
a == b a gleich b?
a != b a ungleich b?
a > b a größer als b?
a >= b a größer oder gleich b?
a < b a kleiner als b?
a <= b a kleiner oder gleich b?

Diese Vergleiche sind binär. Das bedeutet, dass immer nur zwei Operanden verglichen werden können. Will man dagegen prüfen, ob die Temperatur in einem Intervall liegt, so muss man entweder zwei Abfragen verschachteln oder zwei Vergleiche miteinander verknüpfen.

if (temp > 15) {
    if (temp < 25) {
        // Dem Fisch geht es gut
    }
}
Dem Fisch geht es gut, wenn beide Bedingungen zutreffen. Wenn alle Bedingungen zutreffen müssen, damit eine Aussage wahr ist, werden die Teilaussagen mit UND verknüpft:
if (temp > 15 && temp < 25) {
    // Dem Fisch geht es gut
}
Die Verknüpfung UND ist wahr, wenn alle Teilausdrücke wahr sind. Die Verknüpfung ODER ist wahr, wenn mindestens ein Teilausdruck wahr ist. Der NOT-Operator hat nur einen Operanden. Das Ergebnis ist wahr, wenn der Operand nicht wahr ist.

Verknüpfung Gesamtausdruck ist genau dann wahr, wenn...
(a == b) && (c == d) ...alle Teilausdrücke wahr sind
(a == b) || (c == d) ...mindestens ein Teilausdruck wahr ist
!a ...wenn a falsch ist.

Die Umkehrung nach De Morgan

Dem Fisch geht es gut, wenn die Temperatur größer als 15 UND kleiner als 25 Grad Celsius ist. Wann geht es dem Fisch nicht gut? Wir kippen die Teilbedingungen um:
if (temp < 15 && temp > 25) {
    // Dem Fisch geht es nicht mehr gut - oder?
}
Leider wird die Abfrage aber nie erfüllt, da die Temperatur nicht gleichzeitig unter 15 und über 25 Grad sein kann. Also muss auch noch die Verknüpfung von UND zu ODER gekippt werden.
if (temp < 15 || temp > 25) {
    // Dem Fisch geht es nicht mehr gut - definitiv!
}
De Morgan hat erkannt, dass eine verknüpfte Aussage negiert wird, indem jede Teilaussage umgekehrt wird und die Verknüpfung gekippt wird. Wenn Sie sich unsicher sind, wie Sie eine komplexere Aussage negieren, ist es das einfachste, wenn Sie diese einklammern und ein Ausrufezeichen davor stellen.
if (!(temp > 15 && temp < 25)) {
    // Dem Fisch geht es nicht gut!
}
In der Aussagenlogik lässt sich das beweisen, indem eine Wahrheitstabelle aufgestellt wird. Die folgende Tabelle spielt alle Fälle durchspielt. Die beiden rechten Spalten sind die Umkehrung nach De Morgan und Sie können feststellen, dass deren Wahrheitswerte identisch sind.

a b a && b !(a && b) !a || !b
true true true false false
true false false true true
false true false true true
false false false true true

Kurzschluss

Wenn Sie eine UND-Verknüpfung verwenden, müssen alle Teilaussagen wahr sein. Stellt Java fest, dass die erste Teilaussage falsch ist, ist es eigentlich sinnlos, die anderen Teilaussagen noch zu prüfen. Genau dies erfolgt, wenn man && für die UND-Verknüpfung verwendet.

Ähnlich ist es, wenn sich bei einer ODER-Verknüpfung eine Teilaussage als wahr herausstellt. Auch dann müssen die nachfolgenden Teilaussagen nicht geprüft werden und genau das passiert, wenn || verwendet wird.

Problematisch wird dieses Verhalten, wenn die nachfolgende Teilaussage ein Methodenaufruf ist und innerhalb dieser etwas Relevantes passieren soll, beispielsweise eine Benutzereingabe.

Wenn man verhindern will, dass Java den Kurzschluss zieht und alle Teilaussagen auswertet, verwenden Sie nur ein & für das UND und einen | für das ODER.

Boolesche Operatoren

Zeichen Bedeutung
== gleich
!= ungleich
< kleiner
<= kleiner oder gleich
> größer
>= größer oder gleich
&& UND mit Kurzschluss
& UND ohne Kurzschluss
|| ODER mit Kurzschluss
| ODER ohne Kurzschluss
^ exklusiv ODER (XOR): beide Wahrheitswerte unterscheiden sich
! NOT