Guido Krüger - JAVA 1.1 lernen - Kapitel 5
Operator-Vorrangregeln
Tabelle 5.6 listet alle Operatoren in der Reihenfolge ihrer Vorrangregeln auf. Weiter oben stehende Operatoren haben dabei Vorrang vor weiter unten stehenden Operatoren. Innerhalb derselben Gruppe stehende Operatoren werden entsprechend ihrer Assoziativität ausgewertet.
Die Spalte Typisierung gibt die möglichen Operandentypen an. Dabei steht "N" für numerische, "I" für integrale (also ganzzahlig numerische), "L" für logische, "S" für String-, "R" für Referenz-, "P" für primitive und "A" für alle Typen.
|
Gruppe
|
Operator
|
Typisierung
|
Assoziativität
|
Bezeichnung |
|
1
|
++
|
N
|
R
|
Inkrement |
|
--
|
N
|
R
|
Dekrement |
|
+
|
N
|
R
|
Unäres Plus |
|
-
|
N
|
R
|
Unäres Minus |
|
~
|
I
|
R
|
Einerkomplement |
|
!
|
L
|
R
|
Logisches NICHT |
|
(type)
|
A
|
R
|
Type-Cast |
|
2
|
*
|
N,N
|
L
|
Multiplikation |
|
/
|
N,N
|
L
|
Division |
|
%
|
N,N
|
L
|
Modulo |
|
3
|
+
|
N,N
|
L
|
Addition |
|
-
|
N,N
|
L
|
Subtraktion |
|
+
|
S,I
|
L
|
String-Verkettung |
|
4
|
<<
|
I,I
|
L
|
Linksschieben |
|
>>
|
I,I
|
L
|
Rechtsschieben |
|
>>>
|
I,I
|
L
|
Rechtsschieben mit Nullexpansion |
|
5
|
<
|
L,L
|
L
|
Kleiner |
|
<=
|
L,L
|
L
|
Kleiner gleich |
|
>
|
L,L
|
L
|
Größer |
|
>=
|
L,L
|
L
|
Größer gleich |
|
instanceof
|
R,R
|
L
|
Klassenzugehörigkeit |
|
6
|
==
|
P,P
|
L
|
Gleich |
|
!=
|
P,P
|
L
|
Ungleich |
|
==
|
R,R
|
L
|
Referenzgleichheit |
|
!=
|
R,R
|
L
|
Referenzungleichheit |
|
7
|
&
|
I,I
|
L
|
Bitweises UND |
|
&
|
L,L
|
L
|
Logisches UND mit vollständiger Auswertung |
|
8
|
^
|
I,I
|
L
|
Bitweises EXKLUSIV-ODER |
|
^
|
L,L
|
L
|
Logisches EXKLUSIV-ODER |
|
9
|
|
|
I,I
|
L
|
Bitweises ODER |
|
|
|
L,L
|
L
|
Logisches ODER mit vollständiger Auswertung |
|
10
|
&&
|
L,L
|
L
|
Logisches UND mit Short-Circuit-Evaluation |
|
11
|
||
|
L,L
|
L
|
Logisches ODER mit Short-Circuit-Evaluation |
|
12
|
?:
|
L,A,A
|
R
|
Bedingte Auswertung |
|
13
|
=
|
V,A
|
R
|
Zuweisung |
|
+=
|
V,N
|
R
|
Additionszuweisung |
|
-=
|
V,N
|
R
|
Subtraktionszuweisung |
|
*=
|
V,N
|
R
|
Multiplikationszuweisung |
|
/=
|
V,N
|
R
|
Divisionszuweisung |
|
%=
|
V,N
|
R
|
Restwertzuweisung |
|
&=
|
N,N u. L,L
|
R
|
Bitweises-UND-Zuweisung und Logisches-UND-Zuweisung |
|
|=
|
N,N u. L,L
|
R
|
Bitweises-ODER-Zuweisung und Logisches-ODER-Zuweisung |
|
^=
|
N,N u. L,L
|
R
|
Bitweises-EXKLUSIV-ODER-Zuweisung und Logisches-EXKLUSIV-ODER-Zuweisung |
|
<<=
|
V,I
|
R
|
Linksschiebezuweisung |
|
>>=
|
V,I
|
R
|
Rechtsschiebezuweisung |
|
>>>=
|
V,I
|
R
|
Rechtsschiebezuweisung mit Nullexpansion |
Tabelle 5.6: Operator-Vorrangregeln
Warnung |
Etwas unschön ist die Tatsache, daß die bitweisen Operatoren schwächer binden als die relationalen Operatoren. Da sie auf einer Stufe mit den zugehörigen logischen Operatoren stehen, gibt es beim Übersetzen des folgenden Programms den Fehler "Incompatible type for &. Can't convert int to boolean":
|
public class Example0507a
{
public static void main(String[] args)
{
int i = 55;
int j = 97;
if (i & 15 < j & 15) {
System.out.println("LowByte(55) < LowByte(97)");
} else {
System.out.println("LowByte(55) >= LowByte(97)");
}
}
}
Bei der Verwendung der bitweisen Operatoren sind also zusätzliche Klammern erforderlich. Die korrekte Version des Programms lautet (die verbesserte Zeile wurde fett gedruckt):
public class Example0507b
{
public static void main(String[] args)
{
int i = 55;
int j = 97;
if ((i & 15) < (j & 15)) {
System.out.println("LowByte(55) < LowByte(97)");
} else {
System.out.println("LowByte(55) >= LowByte(97)");
}
}
}
Die Ausgabe des Programms ist nun erwartungsgemäß:
LowByte(55) >= LowByte(97)
(C) 1997 Guido Krueger, "Java 1.1 lernen", Addison-Wesley, Bonn, 1997