Namespaces
Variants

C++ Operatorvorrang

Von de.cppreference.net
 
 
C++-Sprache
Allgemeine Themen
Ablaufsteuerung
Bedingte Ausführungsanweisungen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesche - Ganzzahl - Gleitkomma
Zeichen - Zeichenkette - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef Deklaration
Typalias-Deklaration (C++11)
Casts
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Memberfunktionen
Template
Verschiedenes
 
 

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 →
  1. ↑ Der Operand von sizeof kann kein C-Stil-Typcast sein: der Ausdruck sizeof (int) * p wird eindeutig als (sizeof(int)) * p interpretiert, nicht als sizeof((int)*p).
  2. ↑ 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 + = 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
a - > b
a. b
a - > * b
a. * b

Funktionsaufruf

a ( ... )
Komma

a, b
Bedingungsoperator

a ? b : c
Spezielle Operatoren

static_cast konvertiert einen Typ in einen anderen verwandten Typ
dynamic_cast konvertiert innerhalb von Vererbungshierarchien
const_cast fügt cv -Qualifizierer hinzu oder entfernt sie
reinterpret_cast konvertiert einen Typ in einen unverwandten Typ
C-style cast konvertiert einen Typ in einen anderen durch eine Kombination von static_cast , const_cast und reinterpret_cast
new erstellt Objekte mit dynamischer Speicherdauer
delete zerstört zuvor durch den new-Ausdruck erstellte Objekte und gibt den belegten Speicherbereich frei
sizeof fragt die Größe eines Typs ab
sizeof... fragt die Größe eines Pack ab (seit C++11)
typeid fragt die Typinformationen eines Typs ab
noexcept prüft, ob ein Ausdruck eine Exception werfen kann (seit C++11)
alignof fragt die Ausrichtungsanforderungen eines Typs ab (seit C++11)

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