Navigation

2.1.7 Vorrangregeln und Assoziativität

Die Auswertungsreihenfolge von Ausdrücken wird durch den Vorrang der Operatoren bestimmt. Die Assoziativität gibt an, ob eine Folge von Operatoren gleichen Vorrangs von links oder von rechts abgearbeitet wird.

Die folgende Tabelle enthält eine Liste von Operatoren, welche nach Vorrangregeln geordnet sind. (1. Gruppe hat den höchsten Vorrang.)
Operatoren Bezeichnung Assoziativität
( )
[ ]
->
.
Funktions- / Ausdrucksklammer
Feldindizierung
Zeiger auf Strukturelement
Strukturelementvariable
L => R
!
~
++
--
-
( typ)
*
&
sizeof
Negation
Einerkomplement
Inkrement
Dekrement
Vorzeichen Minus
explizite Typkonvertierung
Zugriff über Zeiger
Adresse des Datenobjektes
Größe des Datenobjektes in Bytes
R => L
*
/
%
Multiplikation
Division
Modulo
L => R
+
-
Addition
Subtraktion
L => R
<<
>>
Linksverschiebung von Bits
Rechtsverschiebung von Bits
L => R
<
<=
>
>=
Test kleiner
Test kleiner gleich
Test größer
Test größer gleich
L => R
==
!=
Test gleich
Test ungleich
L => 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
Soll ein Ausdruck niedrigeren Ranges zuerst ausgeführt werden, so muss dieser geklammert werden. Der Ausdruck
x = y = z = 0
wird 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] )
a == b && c == d++
x = f(y) + g(y++)
a[i] = i++
Häufig wird ein Compiler zuerst komplizierte Teilausdrücke berechnen.

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);
}

Navigation