Javaschubla.de - Java als erste Programmiersprache

Rangordnung der Operatoren

int i = 10 - 4 * 2; ergibt 2, nicht etwa 12. Genau wie in der Mathematik gilt Punktrechnung (*, /, %) geht vor Strichrechnung (+, -).

Gleichwertige Operatoren werden auch wie in der Mathematik von links nach rechts abgearbeitet: 12 / 2 * 3 ergibt 18, nicht etwa 2.

Wie ist es mit && (AND) und || (OR)? Wie in der Mathematik und Logik gilt, dass && die höhere Priorität hat: a || b && c wird so ausgewertet: a || (b && c).

Gleichwertige logische Operatoren würden auch von links nach rechts ausgewertet werden - es gibt aber keine gleichwertigen logischen Operatoren, sondern sie haben die Reihenfolge & ^ | && ||. Und wenn man denselben Operator hat, macht das Ergebnis ohnehin keinen Unterschied: Z.B. (a&&b)&&c ist dasselbe wie a&&(b&&c), es gilt also Assoziativität (auch bei ^).

Unäre Operatoren, also solche, die nur einen Operanden erwarten, haben die höchste Priorität. Das sind ++ und -- (Inkrement und Dekrement), + und - als Vorzeichen, ! (das logische NOT/Nicht) und ~ (das bitweise NOT/Nicht). Auch das Casten (z.B. int i = (int) 2.5;) ist ein unärer Operator.

Unäre Operatoren werden von rechts nach links ausgewertet. Das ist aber offensichtlich und in dem Moment wirst du dir keine Gedanken darüber machen, z.B. ist ~-5 natürlich ~(-5), es wird zuerst das Minus vor die 5 gesetzt und dann die -5 invertiert. Oder int i = (int) -2.5; : zuerst wird aus 2.5 durch das Minus -2.5, dann wird gecastet.

Die Zuweisung (=) hat die niedrigste Priorität. Dazu zählen auch die zusammengesetzten Zuweisungsoperatoren (+= usw.) Zuweisungen werden von rechts nach links ausgewertet, alles andere würde auch keinen Sinn ergeben.

    int a, b, c;
    a = b = c = 3;

Erst wird c = 3 gesetzt, der Wert dieses Ausdruckes ist 3, somit wird dann b = 3 gesetzt, der Ausdruck dieses Wertes ist wiederum 3, also wird dann a auf 3 gesetzt.

Übersicht Reihenfolge:

Präzedenztabelle:

Prio 1: ++, --, Vorzeichen +, Vorzeichen -, ~, !, Casten mittels (Typ)
Prio 2: *, /, %
Prio 3: +, - und + für String-Konkatenation
Prio 4: <<, >>, >>>
Prio 5: <, <=, >, >= und instanceof
Prio 6: ==, !=
Prio 7 bis 11: &, ^, |, &&, ||
Prio 12: ? :
Prio 13: = sowie *=, /=, %=, +=, -=, <<=, >>=, >>>=, &=, ^=, |=

Und die Moral von der Geschichte: Wenn man sich nicht sicher ist, setzt man einfach Klammern. Außer bei Punkt-/Strichrechnung, deren Auswertung für jeden offensichtlich ist, empfiehlt es sich immer, die Klammern zu setzen, damit auch jemand, der den Quellcode liest, sofort weiß, in welcher Reihenfolge der Ausdruck ausgewertet wird.


In der nächsten Lektion geht es weiter mit Objektorientierung: Objekte als Parameter übergeben.