1. Einführung
Beginnen wir mit einer alltäglichen Analogie. Stellen Sie sich ein Rezept vor:
Mischen Sie Mehl, Eier und Zucker, schlagen Sie auf, fügen Sie Butter hinzu, schlagen Sie erneut auf.
Sieht seltsam aus? Stellen Sie sich nun vor, zwischen den Wörtern „schlagen“ und „hinzufügen“ stünde ein Komma oder Klammern. Die Reihenfolge der Schritte wird sofort klarer.
In der Programmierung entsteht eine ähnliche Situation, wenn Sie einen komplexen Ausdruck schreiben:
boolean result = a > 0 && b < 10 || c == 3;
Welche Reihenfolge? Was wird zuerst ausgewertet: a > 0 && b < 10, danach || c == 3? Oder alles umgekehrt?
Ohne eine klare Auswertungsreihenfolge kann der Computer die „Zutaten verwechseln“, und Ihr Ergebnis wird unerwartet sein.
2. Operatorpriorität in Java
Java (wie die meisten Programmiersprachen) verwendet eine feste Tabelle der Operatorprioritäten.
Operatoren mit höherer Priorität werden vor Operatoren mit niedrigerer Priorität ausgewertet.
Sehen wir uns den wichtigsten Ausschnitt dieser Tabelle an (für Bedingungen):
| Operator | Beschreibung | Priorität |
|---|---|---|
|
Klammern | am höchsten |
|
Logisches „Nicht“ | hoch |
|
Gleich / ungleich | mittel |
|
Vergleiche | mittel |
|
Logisches „Und“ | niedriger |
|
Logisches „Oder“ | noch niedriger |
(Es gibt auch arithmetische Operatoren – sie haben eine höhere Priorität als die logischen.)
Die Hauptregel
Die Operatoren „Und“ (&&) haben eine höhere Priorität als „Oder“ (||),
das heißt, zuerst wird „Und“ ausgewertet, dann „Oder“. Nicht umsonst ist Und eine logische Multiplikation, und Oder eine Addition.
Blockdiagramm der Auswertung von Bedingungen nach Priorität
graph LR
A["a > 0"] --&&--> B["b < 10"]
B --||--> C["c == 3"]
(In der Praxis: a > 0 && b < 10 || c == 3 – zuerst wird a > 0 && b < 10 berechnet, danach wird das Ergebnis mit c == 3 über || verknüpft.)
3. Auswertungsrichtung der Operatoren: von links nach rechts und umgekehrt
Neben der Priorität gibt es noch das Wort Assoziativität.
Es bestimmt, in welcher Richtung Operatoren ausgewertet werden, wenn sie „nebeneinander“ stehen und dieselbe Priorität haben.
Beispiel:
boolean a = true, b = false, c = true;
boolean result = a && b && c;
Frage: Wie wird das ausgewertet?
Antwort: Die Assoziativität von && ist von links nach rechts.
Das heißt, zuerst a && b, dann das Ergebnis mit c.
Für Bedingungen gilt:
| Operator | Assoziativität |
|---|---|
|
von links nach rechts |
|
von rechts nach links |
4. Klammern – Ihr bester Freund bei komplexen Bedingungen
Hier beginnt die Magie (und die Rettung). Wenn Sie einen Ausdruck schreiben, ändern Klammern die Priorität und machen Ihren Code verständlicher und sicherer.
Beispiel 1 (ohne Klammern):
// Wir wollen: „Wenn der Benutzer volljährig und Staatsbürger ist, oder wenn er einen Sonderausweis hat“
boolean isAdult = age >= 18;
boolean isCitizen = country.equals("Belarus");
boolean hasPermit = hasSpecialPass == true;
if (isAdult && isCitizen || hasPermit)
{
System.out.println("Zugriff erlaubt!");
}
So wertet Java aus:
Zuerst wird isAdult && isCitizen berechnet, danach wird das Ergebnis über || mit hasPermit verknüpft.
- Nehmen wir an, isAdult = true, isCitizen = false, hasPermit = true
- isAdult && isCitizen → true && false → false
- false || true → true
Das heißt, wenn die Person einen Sonderausweis hat, wird sie ohnehin durchgelassen.
Und wenn sie keinen Sonderausweis hat, aber ein erwachsener Staatsbürger ist – wird sie ebenfalls durchgelassen.
Beispiel 2 (mit Klammern):
if (isAdult && (isCitizen || hasPermit))
{
System.out.println("Zugriff erlaubt!");
}
Jetzt prüft das Programm zuerst: isCitizen || hasPermit, und danach diesen Wert zusammen mit isAdult.
Das heißt, Sie müssen volljährig sein und (entweder Staatsbürger sein oder einen Sonderausweis besitzen).
Ein kleiner Unterschied bei den Klammern – ein großer Unterschied in der Logik!
GO TO FULL VERSION