C++ Operatorvorrang
Die folgende Tabelle listet den Vorrang und die Assoziativität der C++-Operatoren auf. Die Operatoren sind von oben nach unten in absteigender Rangfolge aufgelistet. a, b und c sind Operanden.
| Vorrang | Operator | Beschreibung | Assoziativität |
|---|---|---|---|
| 1 | a::b
|
Bereichsauflösung | Links-nach-rechts → |
| 2 | a++ a--
|
Suffix/Postfix Inkrement und Dekrement | |
type(a) type{a}
|
Funktionaler Cast | ||
a()
|
Funktionsaufruf | ||
a[]
|
Indexzugriff | ||
a.b a->b
|
Memberzugriff | ||
| 3 | ++a --a
|
Präfix Inkrement und Dekrement | Rechts-nach-links ← |
+a -a
|
Unäres Plus und Minus | ||
!a ~a
|
Logisches NICHT und bitweises NICHT | ||
(type)a
|
C-Stil-Cast | ||
*a
|
Indirektion (Dereferenzierung) | ||
&a
|
Adresse | ||
^^a
|
Reflexionsoperator (seit C++26) | ||
sizeof
|
Größe[1] | ||
| co_await | await-Ausdruck (C++20) | ||
new – new[]
|
Dynamische Speicherzuweisung | ||
delete – delete[]
|
Dynamische Speicherfreigabe | ||
| 4 | a.*b a->*b
|
Zeiger-auf-Member | Links-nach-rechts → |
| 5 | a * b a / b a % b
|
Multiplikation, Division und Rest | |
| 6 | a + b a - b
|
Addition und Subtraktion | |
| 7 | a << b a >> b
|
Bitweises Linksschieben und Rechtsschieben | |
| 8 | a <=> b
|
Drei-Wege-Vergleichsoperator (seit C++20) | |
| 9 | a < b a <= b a > b a >= b
|
Für relationale Operatoren < und <= und > und >= jeweils
| |
| 10 | a == b a != b
|
Für Gleichheitsoperatoren = und != jeweils
| |
| 11 | a & b
|
Bitweises UND | |
| 12 | a ^ b
|
Bitweises XOR (exklusives Oder) | |
| 13 | a | b
|
Bitweises ODER (inklusives Oder) | |
| 14 | a && b
|
Logisches UND | |
| 15 | a || b
|
Logisches ODER | |
| 16 | a ? b : c
|
Ternärer Bedingungsoperator[2] | Rechts-nach-links ← |
throw
|
throw-Operator | ||
| co_yield | yield-Ausdruck (C++20) | ||
a = b
|
Direkte Zuweisung (standardmäßig für C++-Klassen bereitgestellt) | ||
a += b a -= b
|
Verbundzuweisung durch Summe und Differenz | ||
a *= b a /= b a %= b
|
Verbundzuweisung durch Produkt, Quotient und Rest | ||
a <<= b a >>= b
|
Verbundzuweisung durch bitweises Linksschieben und Rechtsschieben | ||
a &= b a ^= b a |= b
|
Verbundzuweisung durch bitweises UND, XOR und ODER | ||
| 17 | a, b
|
Komma | Links-nach-rechts → |
- ↑ Der Operand von
sizeofkann kein C-Stil-Typcast sein: der Ausdrucksizeof (int) * pwird eindeutig als(sizeof(int)) * pinterpretiert, nicht alssizeof((int)*p). - ↑ Der Ausdruck in der Mitte des bedingten Operators (zwischen
?und:) wird so geparst, als ob er in Klammern stünde: sein Vorrang relativ zu?:wird ignoriert.
Beim Parsen eines Ausdrucks bindet ein Operator, der in einer Zeile der obigen Tabelle mit einem höheren Vorrang aufgeführt ist, stärker (als ob durch Klammern) an seine Argumente als jeder Operator, der in einer Zeile darunter mit einem niedrigeren Vorrang aufgeführt ist. Zum Beispiel werden die Ausdrücke std::cout << a & b und *p++ als (std::cout << a) & b und *(p++) geparst, und nicht als std::cout << (a & b) oder (*p)++.
Operatoren mit demselben Vorrang binden in Richtung ihrer Assoziativität an ihre Argumente. Zum Beispiel wird der Ausdruck a = b = c als a = (b = c) geparst und nicht als (a = b) = c wegen der Rechts-nach-links-Assoziativität der Zuweisung, aber a + b - c wird als (a + b) - c geparst und nicht als a + (b - c) wegen der Links-nach-rechts-Assoziativität von Addition und Subtraktion.
Die Angabe der Assoziativität ist für unäre Operatoren redundant und wird nur der Vollständigkeit halber gezeigt: unäre Präfixoperatoren assoziieren immer rechts-nach-links (delete ++*p ist delete(++(*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 sind: a.b++ wird als (a.b)++ geparst und nicht als a.(b++).
Der Operatorvorrang wird durch Operatorüberladung nicht beeinflusst. Zum Beispiel wird std::cout << a ? b : c; als (std::cout << a) ? b : c; geparst, weil der Vorrang der arithmetischen Linksverschiebung höher ist als der des bedingten Operators.
Hinweise
Präzedenz und Assoziativität sind Kompilierzeit-Konzepte und unabhängig von der Auswertungsreihenfolge , welche ein Laufzeit-Konzept ist.
Der Standard selbst legt keine Vorrangstufen fest. Sie werden aus der Grammatik abgeleitet.
const_cast
,
static_cast
,
dynamic_cast
,
reinterpret_cast
,
typeid
,
sizeof...
,
noexcept
und
alignof
sind nicht enthalten, da sie niemals mehrdeutig sind.
Einige der Operatoren haben alternative Schreibweisen (z.B. and für && , or für || , not für ! , usw.).
In C hat der ternäre bedingte Operator eine höhere Priorität als Zuweisungsoperatoren. Daher wird der Ausdruck e = a < d ? a ++ : a = d , der in C++ als e = ( ( a < d ) ? ( a ++ ) : ( a = d ) ) geparst wird, in C aufgrund grammatikalischer oder semantischer Einschränkungen nicht kompilieren. Weitere Einzelheiten finden Sie auf der entsprechenden C-Seite.
Siehe auch
| Häufige Operatoren | ||||||
|---|---|---|---|---|---|---|
| Zuweisung |
Inkrement
Dekrement |
Arithmetik | Logisch | Vergleich |
Member
Zugriff |
Sonstige |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
...
]
|
Funktionsaufruf
a ( ... ) |
|
Komma
a, b |
||||||
|
Bedingungsoperator
a ? b : c |
||||||
| Spezielle Operatoren | ||||||
|
static_cast
konvertiert einen Typ in einen anderen verwandten Typ
|
||||||
|
C-Dokumentation
für
C-Operator-Präzedenz
|