Die folgende Tabelle enthält eine Liste von Operatoren, welche nach Vorrangregeln geordnet sind. (1. Gruppe hat den höchsten Vorrang.)
Soll ein Ausdruck niedrigeren Ranges zuerst ausgeführt werden, so muss dieser geklammert werden. Der Ausdruck
Operatoren Bezeichnung Assoziativität ( )
[ ]
->
.Funktions- / Ausdrucksklammer
Feldindizierung
Zeiger auf Strukturelement
StrukturelementvariableL => R !
~
++
--
-
( typ)
*
&
sizeofNegation
Einerkomplement
Inkrement
Dekrement
Vorzeichen Minus
explizite Typkonvertierung
Zugriff über Zeiger
Adresse des Datenobjektes
Größe des Datenobjektes in BytesR => L *
/
%Multiplikation
Division
ModuloL => R +
-Addition
SubtraktionL => R <<
>>Linksverschiebung von Bits
Rechtsverschiebung von BitsL => R <
<=
>
>=Test kleiner
Test kleiner gleich
Test größer
Test größer gleichL => R ==
!=Test gleich
Test ungleichL => R & bitweises UND L => R ^ bitweises exklusives ODER L => R | bitweises inklusives ODER L => R && logisches UND L => R || logisches ODER L => R ?: bedingte Zuweisung R => L =
op=Wertzuweisungen
op: + - * / % & | ^ << >>R => L , Kommaoperator L => R
x = y = z = 0wird behandelt, als wäre er geklammert
x = (y = (z = 0))ACHTUNG: Unabhänging vom Rang der Operatoren darf der Compiler selbst entscheiden in welcher Reihenfolge Teilausdrücke ausgewertet werden. Das kann insbesondere bei Ausdrücken mit Nebeneffekten zu Problemen führen, z.B.:
fu ( x++ , f[x] )Häufig wird ein Compiler zuerst komplizierte Teilausdrücke berechnen.
a == b && c == d++
x = f(y) + g(y++)
a[i] = i++
BEISPIELE/b217a.c: #include <stdio.h> main() /* Vorrang und bitorientierte Operatoren */ { int x=3, y=2, z=1; printf("x = %d, y = %d, z = %d\n", x, y, z); printf("x | y & z => %d\n", x | y & z ); printf("x | y & ~z => %d\n", x | y & ~z); printf("x ^ y & ~z => %d\n", x ^ y & ~z); printf("x & y && z => %d\n", x & y && z); printf("! z | z => %d\n", ! z | z ); printf("~ z | z => %d\n", ~ z | z ); printf("z ^ z => %d\n", z ^ z ); printf("z<<3 => %d\n", z=z<<3 ); printf("(-1)<<3 => %d\n", (-1)<<3 ); }
BEISPIELE/b217b.c: #include <stdio.h> main() /* Vorrang */ { int x,y,z; x=y=z= 1; ++x || ++y && ++z; printf("x=%d, y=%d, z=%d\n", x,y,z); x=y=z= 1; ++x && ++y || ++z; printf("x=%d, y=%d, z=%d\n", x,y,z); x=y=z= 1; ++x && ++y && ++z; printf("x=%d, y=%d, z=%d\n", x,y,z); x=y=z= -1; ++x || ++y && ++z; printf("x=%d, y=%d, z=%d\n", x,y,z); x=y=z= -1; ++x && ++y || ++z; printf("x=%d, y=%d, z=%d\n", x,y,z); x=y=z= -1; ++x && ++y && ++z; printf("x=%d, y=%d, z=%d\n", x,y,z); }