C++ Operator Precedence
Die folgende Tabelle zeigt Ausführungspriorität und Assoziativität der C++-Operatoren. Die Operatoren sind von oben nach unten von vorrangiger zu nachrangiger Priorität hin geordnet.
Priorität | Operator | Beschreibung | Assoziativität |
---|---|---|---|
1 | ::
|
Bereichsauflösung | von links nach rechts |
2 | ++ --
|
Suffix-/Postfix-Inkrement und -Dekrement | |
()
|
Funktionsaufruf | ||
[]
|
Arrayindizierung | ||
.
|
Elementselektion einer Referenz | ||
−>
|
Elementselektion eines Zeigers | ||
3 | ++ --
|
Präfix-Inkrement und -Dekrement | von rechts nach links |
+ −
|
unäres Plus und unäres Minus | ||
! ~
|
logisches NOT und bitweises NOT | ||
(type)
|
Typkonvertierung | ||
*
|
Dereferenzierung | ||
&
|
Adresse von | ||
sizeof
|
Typ-/Objektgröße | ||
new , new[]
|
Reservierung Dynamischen Speichers | ||
delete , delete[]
|
Freigabe Dynamischen Speichers | ||
4 | .* ->*
|
Zeiger-auf-Element | von links nach rechts |
5 | * / %
|
Multiplikation, Division und Rest | |
6 | + −
|
Addition und Subtraktion | |
7 | << >>
|
bitweise Rechts- und Linksverschiebung | |
8 | < <=
|
kleiner-als und kleiner-gleich | |
> >=
|
größer-als und größer-gleich | ||
9 | == !=
|
gleich und ungleich | |
10 | &
|
bitweises AND | |
11 | ^
|
bitweises XOR (entweder-oder) | |
12 | |
|
bitweises OR (ein oder beide) | |
13 | &&
|
logisches AND | |
14 | ||
|
logisches OR | |
15 | ?:
|
bedingte Zuweisung | von rechts nach links |
=
|
einfache Zuweisung (automatische Unterstützung ist in C++-Klassen Vorgabe) | ||
+= −=
|
Zuweisung nach Addition/Subtraktion | ||
*= /= %=
|
Zuweisung nach Multiplikation, Division, und Rest | ||
<<= >>=
|
Zuweisung nach Links- bzw. Rechtsverschiebung | ||
&= ^= |=
|
Zuweisung nach bitweisem AND, XOR, und OR | ||
16 | throw
|
Ausnahme werfen | |
17 | ,
|
Komma (Sequenzoperator) | von links nach rechts |
Beim Parsen werden höher gelistete Operatoren enger an ihre Argumente gebunden als weiter unten gelistete, und zwar so, als ob sie geklammert wären. Somit werden z.B. die Ausdrücke std::cout<<a&b und *p++ zu (std::cout<<a)&b und *(p++) geparst, und nicht zu std::cout<<(a&b) oder (*p)++.
Operatoren, die in derselben Zelle gelistet sind (es können auch mehrere Operatoren in einer Zelle aufgeführt sein), werden mit gleicher Priorität in der angegebenen Auswertungsrichtung ausgewertet. Beispielsweise wird der Ausdruck a=b=c aufgrund der Assoziativität von-rechts-nach-links zu a=(b=c) ausgewertet, und nicht zu (a=b)=c .
Die Operatorenpriorität bleibt auch bei Operator-Überladung bestehen.
[Bearbeiten] Bemerkungen
Prioritätsstufen sind nicht durch die Norm spezifiziert, sondern aus der Grammatik hergeleitet.
const_cast, static_cast, dynamic_cast, reinterpret_cast und typeid sind nicht enthalten, da sie immer eindeutig sind.
Einige der Operatoren haben alternative Schreibweisen (z.B. and für &&
, or für ||
, not für !
, usw.).
[Bearbeiten] Siehe auch
Auswertungsreihenfolge von Operator-Argumenten zur Laufzeit.