Die Operatoren werden in Java nach einer genau definierten Reihenfolge ausgewertet. Operatoren eines höheren Ranges bekommen vor Operatoren niedrige Ränge Vorrang.
Diese Spracheigenschaft wird als Vorrangregel oder Bindungsregel bezeichnet.
In Java besitzt jeder Operator eine bestimmte Bindungskraft. So besitzt bspw. der Multiplikations-Operator eine höhere Bindungskraft als der Additions-Operator und wird demnach in Ausdrücken zuerst ausgewertet.
Wie die einfache mathematische Regel: Punktrechnung vor Strichrechnung.
In manchen Fällen besitzen Java-Operatoren die gleiche Bindungskraft also den gleichen Rang, dann entscheidet ihre Assoziativität über die Auswertungsreihenfolge.
So besitzen der Additions– und Subtraktions-Operator alleine gesehen die gleiche Bindungskraft.
Werden sie aber in einer Kette von Additionen und Subtraktionen verwendet, bestimmt ihre Assoziativität über die Auswertungsreihenfolge. In diesem Fall sind beide Operatoren linksassoziativ, daher wird der Ausdruck von links nach rechts ausgewertet.
Daher wird a+b-c
wie (a+b)-c
ausgewertet und nicht wie a+(b-c)
.
In der folgenden Tabelle sind alle Java-Operatoren in Gruppen zusammengefasst.
Die Gruppenummer entspricht dem Rang des jeweiligen Operators. Gruppe eins enthält die Java-Operatoren mit dem höchsten Rang. Die Assoziativität gibt an, ob ein Operator von links nach rechts oder von rechts nach links ausgewertet wird.
Gruppe | Operator | Beispiel | Bezeichnung | Assoziat. | Beschreibung |
---|---|---|---|---|---|
1 | ++ | a++ | Postinkrement | Rechts | Beim Postinkrement wird dem übergeordneten Ausdruck der ursprüngliche Wert von a übergeben. Anschließend wird a um 1 erhöht. |
– – | a- – | Postdekrement | Rechts | Beim Postdekrement wird dem übergeordneten Ausdruck der ursprüngliche Wert von a übergeben. Anschließend wird a um 1 verringert. | |
++ | ++a | Präinkrement | Rechts | Beim Präinkrement wird dem übergeordneten Ausdruck der bereits um 1 erhöhte Wert von a übergeben. | |
– – | – -a | Prädekrement | Rechts | Beim Prädekrement wird dem übergeordneten Ausdruck der bereits um 1 verringerte Wert von a übergeben. | |
+ | +a | Positives Vorzeichen | Rechts | Nicht zwingend, da +a dem gleichen Wert wie a entspricht. | |
– | -a | Negatives Vorzeichen | Rechts | Entspricht dem negativem Wert von a. | |
~ | ~a | Einerkomplement | Rechts | Es werden alle Bits von a invertiert, das heißt aus 0 wird 1 und umgekehrt. | |
! | !a | Logisches Nicht | Rechts | Es wird a negiert. Ist a wahr, wird false zurückgegeben, andernfalls true. | |
(type) | (int) a | Type-Cast | Rechts | Der Datentyp von a wird in den in Klammern angegebenen Datentyp umgwandelt. | |
2 | * | a * b | Multiplikation | Links | Aus der Multiplikation von a mal b ergibt sich das Produkt. |
/ | a / b | Division | Links | Aus der Division von a durch b ergibt sich der Quotient. | |
% | a % b | Division mit Rest | Links | Aus der Division mit Rest (Modulo) von a durch b ergibt sich der Rest. | |
3 | + | a + b | Addition | Links | Aus der Addition von a plus b ergibt sich die Summe. |
– | a – b | Subtraktion | Links | Aus der Subtraktion von a minus b ergibt sich die Differenz. | |
+ | „A“ + b | String-Verkettung | Links | Ein String wird mit einem anderen String angefügt. Wenn nötig wird dabei der Wert in einen String umgewandelt. | |
4 | << | a << b | Linksschieben | Links | Es werden die Bits von a um b Positionen nach links geschoben. Auch das höchstwertige Bit wird nach links geschoben und erfährt keine besondere Behandlung. |
>> | a >> b | Rechtsschieben mit Vorzeichen (arithmetisch) |
Links | Es werden die Bits von a um b Positionen nach rechts geschoben. Das höchstwertige Bit wird nach dem Schieben gesetzt, falls es auch vor dem Schieben gesetzt war. Somit bleibt eine negative Zahl auch nach dem Rechtsschieben negativ. | |
>>> | a >>> b | Rechtsschieben ohne Vorzeichen (logisch) |
Links | Es werden die Bits von a um b Positionen nach rechts geschoben. Das höchstwertige Bit wird nach dem Schieben immer auf 0 gesetzt. | |
5 | < | a < b | Kleiner als | Links | Es wird a mit b verglichen. Ist a kleiner als b wird true zurückgegeben, andernfalls false. |
<= | a <= b | Kleiner gleich | Links | Es wird a mit b verglichen. Ist a kleiner als oder gleich b wird true zurückgegeben, andernfalls false. | |
> | a > b | Größer als | Links | Es wird a mit b verglichen. Ist a größer als b wird true zurückgegeben, andernfalls false. | |
>= | a >= b | Größer gleich | Links | Es wird a mit b verglichen. Ist a größer als oder gleich b wird true zurückgegeben, andernfalls false. | |
instanceof | A instanceof B | Klassenabfrage | Links | Es wird geprüft ob das Objekt A eine Instanz der Klasse B ist. Ist dies wahr wird true zurückgegeben, andernfalls false. | |
6 | == | a == b | Gleich | Links | Es wird a mit b verglichen. Ist a gleich b wird true zurückgegeben, andernfalls false. Wenn a und b Referenztypen sind, wird verglichen ob beide Variablen auf das gleiche Objekt referenzieren. Falls ja, wird true zurückgegeben. |
!= | a != b | Ungleich | Links | Es wird a mit b verglichen. Ist a ungleich b wird true zurückgegeben, andernfalls false. Wenn a und b Referenztypen sind, wird verglichen ob beide Variablen auf verschiedene Objekte referenzieren. Falls ja, wird true zurückgegeben. | |
7 | & | a & b | Und (bitweise) | Links | Es wird a und b bitweise ausgewertet. Dabei wird jedes korrespondierende Bit von a und b miteinander Und-verknüpft. |
& | a & b | Und (logisch) | Links | Es wird a und b ausgewertet. Sind beide wahr, wird true zurückgegeben, andernfalls false. | |
8 | ^ | a ^ b | Exklusiv-Oder (bitweise) | Links | Es wird a und b bitweise ausgewertet. Dabei wird jedes korrespondierende Bit von a und b miteinander Exklusiv-Oder-verknüpft. |
^ | a ^ b | Exklusiv-Oder (logisch) | Links | Es wird a und b ausgewertet. Besitzt a einen anderen Wahrheitswert als b wird true zurückgegeben, andernfalls false. | |
9 | | | a | b | Oder (bitweise) | Links | Es wird a und b bitweise ausgewertet. Dabei wird jedes korrespondierende Bit von a und b miteinander Oder-verknüpft. |
| | a | b | Oder (logisch) | Links | Es wird a und b ausgewertet. Ist mindestens einer der beiden Ausdrücke wahr, wird true zurückgegeben, andernfalls false. | |
10 | && | a && b | Und (S-C-E) | Links | Es wird a und b ausgewertet. Die Auswertung wird abgebrochen wenn a bereits falsch ist. Dann wird sofort false zurückgegeben. Sind beide wahr, wird true zurückgegeben, andernfalls false. |
11 | || | a || b | Oder (S-C-E) | Links | Es wird a und b ausgewertet. Die Auswertung wird abgebrochen wenn a bereits wahr ist. Dann wird sofort true zurückgegeben. Ist mindestens einer der beiden Ausdrücke wahr, wird true zurückgegeben, andernfalls false. |
12 | ?: | c ? a:b | Bedingte Auswertung | Rechts | Falls die Bedingung c wahr ist, wird der Wert von a zurückgegeben. Andernfalls, wird der Wert von b zurückgegeben. |
13 | = | a = b | Einfache Zuweisung | Rechts | Es wird a der Wert von b zugewiesen und b als Rückgabewert geliefert. |
+= | a += b | Additions-zuweisung | Rechts | Es wird a das Ergebnis aus a + b zugewiesen und a + b als Rückgabewert geliefert. | |
-= | a -= b | Subtraktions-zuweisung | Rechts | Es wird a das Ergebnis aus a – b zugewiesen und a – b als Rückgabewert geliefert. | |
*= | a *= b | Multiplikations-zuweisung | Rechts | Es wird a das Ergebnis aus a * b zugewiesen und a * b als Rückgabewert geliefert. | |
/= | a /= b | Divisions-zuweisung | Rechts | Es wird a das Ergebnis aus a / b zugewiesen und a / b als Rückgabewert geliefert. | |
%= | a %= b | Modulo-zuweisung | Rechts | Es wird a das Ergebnis aus a % b zugewiesen und a % b als Rückgabewert geliefert. | |
&= | a &= b | Und-Zuweisung | Rechts | Es wird a das Ergebnis aus a & b zugewiesen und a & b als Rückgabewert geliefert. | |
|= | a |= b | Oder-Zuweisung | Rechts | Es wird a das Ergebnis aus a | b zugewiesen und a | b als Rückgabewert geliefert. | |
<<= | a <<= b | Linksschiebe-Zuweisung | Rechts | Es wird a das Ergebnis aus a << b zugewiesen und a << b als Rückgabewert geliefert. | |
>>= | a >>= b | Rechtsschiebe-Zuweisung ohne Vorzeichen | Rechts | Es wird a das Ergebnis aus a >> b zugewiesen und a >> b als Rückgabewert geliefert. | |
>>>= | a >>>= b | Rechtsschiebe-Zuweisung ohne Vorzeichen | Rechts | Es wird a das Ergebnis aus a >>> b zugewiesen und a >>> b als Rückgabewert geliefert. |
Comments 3
In Zeile 11 sollte es wohl || an Stelle von | sein.
Author
Hallo Timo,
vielen Dank für deinen Hinweis! Ich habe Zeile 11 jetzt korrigiert.
Viele Grüße, Chris
Pingback: Operatoren, Ausdrücke und Anweisungen in Java