Namespaces
Variants

C Operator Precedence

From cppreference.net

Die folgende Tabelle listet die Präzedenz und Assoziativität der C-Operatoren auf. Operatoren sind von oben nach unten in absteigender Präzedenz aufgelistet.

Priorität Operator Beschreibung Assoziativität
1 ++ -- Postfix-Inkrement und -Dekrement Links nach rechts
() Funktionsaufruf
[] Array-Indexierung
. Struktur- und Union-Memberzugriff
-> Struktur- und Union-Memberzugriff über Zeiger
( type ){ list } Compound Literal (C99)
2 ++ -- Präfix-Inkrement und -Dekrement [Anmerkung 1] Rechts nach links
+ - Unäres Plus und Minus
! ~ Logisches NOT und bitweises NOT
( type ) Typumwandlung
* Indirektion (Dereferenzierung)
& Adressoperator
sizeof Größenoperator [Anmerkung 2]
_Alignof Ausrichtungsanforderung (C11)
3 * / % Multiplikation, Division und Rest Links nach rechts
4 + - Addition und Subtraktion
5 << >> Bitweise Linksverschiebung und Rechtsverschiebung
6 < <= Für relationale Operatoren < und ≤
> >= Für relationale Operatoren > und ≥
7 == != Für relationale Operatoren = und ≠
8 & Bitweises UND
9 ^ Bitweises XOR (exklusives ODER)
10 | Bitweises ODER (inklusives ODER)
11 && Logisches UND
12 || Logisches ODER
13 ?: Bedingter Operator [Anmerkung 3] Rechts nach links
14 [Anmerkung 4] = Einfache Zuweisung
+= -= Zuweisung mit Addition und Subtraktion
*= /= %= Zuweisung mit Multiplikation, Division und Rest
<<= >>= Zuweisung mit bitweiser Links- und Rechtsverschiebung
&= ^= |= Zuweisung mit bitweisem UND, XOR und ODER
15 , Komma-Operator Links nach rechts
  1. Der Operand von Präfix- ++ und -- kann kein Typ-Cast sein. Diese Regel verbietet grammatikalisch einige Ausdrücke, die semantisch ohnehin ungültig wären. Einige Compiler ignorieren diese Regel und erkennen die Ungültigkeit semantisch.
  2. Der Operand von sizeof kann kein Typ-Cast sein: Der Ausdruck sizeof ( int ) * p wird eindeutig interpretiert als ( sizeof ( int ) ) * p , aber nicht als sizeof ( ( int ) * p ) .
  3. Der Ausdruck in der Mitte des bedingten Operators (zwischen ? und : ) wird geparst, als ob er in Klammern stünde: Seine Präzedenz relativ zu ?: wird ignoriert.
  4. Die linken Operanden von Zuweisungsoperatoren müssen unäre (Level-2 Non-Cast) Ausdrücke sein. Diese Regel verbietet grammatikalisch einige Ausdrücke, die semantisch ohnehin ungültig wären. Viele Compiler ignorieren diese Regel und erkennen die Ungültigkeit semantisch. Zum Beispiel ist e = a < d ? a ++ : a = d ein Ausdruck, der aufgrund dieser Regel nicht geparst werden kann. Allerdings ignorieren viele Compiler diese Regel und parsen ihn als e = ( ( ( a < d ) ? ( a ++ ) : a ) = d ) und geben dann einen Fehler aus, da er semantisch ungültig ist.

Beim Parsen eines Ausdrucks wird ein Operator, der in einer bestimmten Zeile aufgeführt ist, enger (als ob durch Klammern) an seine Argumente gebunden als jeder Operator, der in einer darunter liegenden Zeile aufgeführt ist. Zum Beispiel wird der Ausdruck * p ++ geparst als * ( p ++ ) , und nicht als ( * p ) ++ .

Operatoren, die sich in derselben Zelle befinden (möglicherweise sind mehrere Zeilen von Operatoren in einer Zelle aufgeführt), werden mit derselben Priorität in der angegebenen Richtung ausgewertet. Beispielsweise wird der Ausdruck a = b = c als a = ( b = c ) geparst und nicht als ( a = b ) = c aufgrund der Rechts-nach-links-Assoziativität.

Hinweise

Präzedenz und Assoziativität sind unabhängig von der Auswertungsreihenfolge .

Der Standard selbst legt keine Vorrangstufen fest. Diese werden aus der Grammatik abgeleitet.

In C++ hat der bedingte Operator die gleiche Priorität wie Zuweisungsoperatoren, und Präfix- ++ und -- sowie Zuweisungsoperatoren haben keine Einschränkungen bezüglich ihrer Operanden.

Die Assoziativitätsangabe ist für unäre Operatoren redundant und wird nur der Vollständigkeit halber gezeigt: unäre Präfixoperatoren assoziieren immer rechts-nach-links ( sizeof ++* p ist sizeof ( ++ ( * p ) ) ) und unäre Postfixoperatoren assoziieren immer links-nach-rechts ( a [ 1 ] [ 2 ] ++ ist ( ( a [ 1 ] ) [ 2 ] ) ++ ). Beachten Sie, dass die Assoziativität für Memberzugriffsoperatoren bedeutsam ist, obwohl sie mit unären Postfixoperatoren gruppiert werden: a. b ++ wird als ( a. b ) ++ geparst und nicht als a. ( b ++ ) .

Referenzen

  • C17-Standard (ISO/IEC 9899:2018):
  • A.2.1 Ausdrücke
  • C11-Standard (ISO/IEC 9899:2011):
  • A.2.1 Ausdrücke
  • C99-Standard (ISO/IEC 9899:1999):
  • A.2.1 Ausdrücke
  • C89/C90-Standard (ISO/IEC 9899:1990):
  • A.1.2.1 Ausdrücke

Siehe auch

Auswertungsreihenfolge von Operator-Argumenten zur Laufzeit.

Häufige Operatoren
Zuweisung Inkrement
Dekrement
Arithmetisch Logisch Vergleich Mitgliederzugriff
Zugriff
Sonstige

a = b
a + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b

a [ b ]
* a
& a
a - > b
a. b

a ( ... )
a, b
( type ) a
a ? b : c
sizeof


_Alignof
(seit C11)
(bis C23)

alignof
(seit C23)

C++ Dokumentation für C++ Operator-Präzedenz