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.