"Punktrechnung geht vor Strichrechnung" – so haben Sie es in der Schule gelernt. Und tatsächlich, auch in Java ist dieses Prinzip bei der Auswertung von arithmetischen Ausdrücken gültig. Der Ausdruck auf der rechten Seite der folgenden Wertzuweisung
int a = 2 + 3 * 5;
ergibt den Wert 17. Denn weil Punktrechnung vor Strichrechnung geht, wird zuerst 3·5 = 15 berechnet und dann 2+15 = 17.
Man sagt auch, dass der Operator * eine höhere Präzedenz als der Operator + hat (von lat. praecedere – vorgehen).
Wie aber wird der Ausdruck auf der rechten Seite der folgenden Wertzuweisung ausgewertet? Die Operatoren sind beide Strichrechnungs-Operatoren, sie haben die gleiche Präzedenz.
int b = 5 - 3 + 1;
In Java ist festgelegt, dass hier von links nach rechts ausgewertet wird. Zuerst wird 5-3 = 2 berechnet, und dann 2+1 = 3.
Durch Klammerung kann immer eine bestimmte Auswertungsreihenfolge erzwungen werden. Ausdrücke, die in Klammern stehen, werden immer zuerst ausgewertet – unabhängig von Präzedenzen und Standard-Auswertungsreihenfolgen. Der Ausdruck
int c = 5 - (3 + 1);
ergibt 1, da der geklammerte Ausdruck zuerst ausgewertet wird.
Ausdrücke, in denen viele Klammern auftreten, sind schwer lesbar. Präzedenzen und Standard-Auswertungsreihenfolgen dienen dazu, Klammern einzusparen.
In Java gibt es noch viele weitere Operatoren, und diese haben teils höhere und teils niedrigere Präzedenz als Punkt- und Strichrechnung. Die folgende Tabelle listet die Präzedenz der Operatoren auf.
Die Operatoren mit Präzedenz 1 sind die einstelligen Operatoren, diese binden am stärksten. Die darauffolgenden Operatoren sind zweistellige Operatoren. Die Operatoren mit Präzedenz 2 binden am zweitstärksten, die Operatoren mit Präzedenz 3 am drittstärksten usw. Am schwächsten binden die Wertzuweisungsoperatoren mit Präzedenz 12.
Wenn in einem Ausdruck mehrere Operatoren mit gleicher Präzedenz vorkommen, so werden diese von links nach rechts ausgewertet – mit Ausnahme der Wertzuweisungsoperatoren; diese werden von rechts nach links ausgewertet.
Präzedenz | Operatoren | Bedeutung |
---|---|---|
1 | ++ | Prä- oder Postinkrement |
-- | Prä- oder Postdekrement | |
+ - | Vorzeichen | |
~ | bitweises Komplement | |
! | logische Negation | |
(Type) | Typumwandlung | |
2 | * / % | Multiplikation, Division, Rest |
3 | + - | Addition, Subtraktion |
+ | String-Verkettung | |
4 | << | Linksschieben |
>> | Rechtsschieben, Vorzeichenbit nachziehen | |
>>> | Rechtsschieben, Nullen nachziehen | |
5 | < <= | kleiner, kleiner oder gleich |
> >= | größer, größer oder gleich | |
6 | == | gleich |
!= | ungleich | |
7 | & | logisches Und |
& | bitweises Und | |
8 | ^ | logisches Exklusiv-Oder |
^ | bitweises Exklusiv-Oder | |
9 | | | logisches Oder |
| | bitweises Oder | |
10 | && | logisches Und |
11 | || | logisches Oder |
12 | = | Wertzuweisung |
*= /= %= | kombinierte Wertzuweisung | |
+= -= | ||
<<= >>= >>>= | ||
&= ^= |= |
Welchen Wert ergibt der folgende Ausdruck? 1)
30+-3*5<<1>30==5<4||7>6&&7<6
Hier hilft nur eingehendes Studium der Präzedenzliste. Aber solche Ausdrücke kommen natürlich in der Programmierpraxis nicht vor.
Dagegen ist folgende Bedingung einer If-Anweisung sehr gut lesbar; und sie wird aufgrund der Operator-Präzedenzen in genau der Weise ausgewertet, wie sie gedacht ist, ohne dass Klammern erforderlich sind. Die Reihenfolge der Auswertung ist darunter anhand der Präzedenzen der Operatoren ersichtlich.
Zuerst wird die Multiplikation ausgeführt (Präzedenz 2), dann die Addition (Präzedenz 3), dann die Schiebeoperation (Präzedenz 4) usw.
In Java wird der Operator & sowohl als logisches Und als auch als bitweises Und bei ganzzahligen Werten verwendet. Im letzteren Fall spricht man auch von "Maskierung", weil beispielsweise bei dem Ausdruck
a&1
alle Bits der Binärdarstellung des Wertes von a ausgeblendet werden bis auf das letzte. Technisch gesehen werden die Bits der Binärdarstellungen von a und von 1 mit Und verknüpft.
Der Ausdruck a&1 kann zur Prüfung, ob a ungerade ist, verwendet werden. Anstelle von
if (a%2 == 1)
kann man schreiben
if ((a&1) == 1)
Wichtig sind hier die Klammern um a&1, denn der Operator & bindet schwächer als der Operator ==.
Bei Ausdrücken wie if (x==0 & y==0) ist diese schwächere Bindung dagegen durchaus gewünscht.
Entsprechendes gilt für den Operator |, der sowohl als logisches Oder als auch als bitweises Oder verwendet wird.
Python
In der Programmiersprache Python gibt es für die logischen Operationen die Operatoren and und
1) true
Weiter mit: [up]