In diesem Tutorial lernen wir anhand von Beispielen die Priorität und Assoziativität von Operatoren in C ++ kennen.
Vorrang der C ++ - Operatoren
Wenn ein Ausdruck mehrere Operatoren enthält, werden die Operationen nicht gleichzeitig ausgewertet. Vielmehr lassen Operatoren mit höherer Priorität ihre Operationen zuerst bewerten.
Betrachten wir ein Beispiel:
int x = 5 - 17 * 6;
Hier hat der Multiplikationsoperator *
eine höhere Priorität als der Subtraktionsoperator -
. Daher 17 * 6
wird zuerst ausgewertet.
Infolgedessen ist der obige Ausdruck äquivalent zu
int x = 5 - (17 * 6);
Wenn wir 5 - 17
zuerst bewerten möchten, müssen wir sie in Klammern setzen :
int x = (5 - 17) * 6;
Beispiel 1: Vorrang der Operatoren
#include using namespace std; int main() ( // evaluates 17 * 6 first int num1 = 5 - 17 * 6; // equivalent expression to num1 int num2 = 5 - (17 * 6); // forcing compiler to evaluate 5 - 17 first int num3 = (5 - 17) * 6; cout << "num1 = " << num1 << endl; cout << "num2 = " << num2 << endl; cout << "num3 = " << num3 << endl; return 0; )
Ausgabe
num1 = -97 num2 = -97 num3 = -72
Hinweis: Da es in C ++ viele Operatoren mit mehreren Prioritätsebenen gibt, wird dringend empfohlen, Klammern zu verwenden, um unseren Code besser lesbar zu machen.
Rangfolge der C ++ - Operatoren
Die folgende Tabelle (von cppreference.com entnommen) zeigt die Priorität von C ++ - Operatoren. Vorrangstufe 1 kennzeichnet Operatoren mit der höchsten Priorität, während Vorrangstufe 17 Operatoren mit der niedrigsten Priorität kennzeichnet.
Die Eigenschaft der Assoziativität wird in Kürze erörtert.
Vorrang | Operator | Beschreibung | Assoziativität |
---|---|---|---|
1 | :: :: | Scope Resolution | Links nach rechts |
2 | a ++ a-- type () type () a () a () . -> | Suffix / Postfix-Inkrement Suffix / Postfix-Dekrement Funktionsbesetzung Funktionsbesetzung Funktionsaufruf Index Mitgliederzugriff von einem Objekt Mitgliedszugriff von Objekt ptr | Links nach rechts |
3 | ++ a --a + a -a ! ~ (Typ) * a & a sizeof co_await neu new () Delete () | Präfix Schritt Präfix Dekrement Unäres Plus Unary minus Logisches NICHT Bitwise NICHT C Stil Guss Indirection (Dereferenzierung) Adresse-of - Größe-of await-expression Dynamische Speicherzuordnung Dynamische Speicherfreigabe | Rechts nach links |
4 | . * -> * | Mitglied Objektselektorbits Mitglied Zeiger Selektor | Links nach rechts |
5 | a * b a / b a% b | Die Multiplikation der Division Modulus | Links nach rechts |
6 | a + b a - b | Addition Subtraktion | Links nach rechts |
7 | << >> | Bitweise Verschiebung nach links Bitweise Verschiebung nach rechts | Links nach rechts |
8 | <= < | Drei-Wege-Vergleichsoperator | Links nach rechts |
9 | < <= > > = | Kleiner als kleiner oder gleich größer als größer als oder gleich | Links nach rechts |
10 | == ! = | Gleich ungleich un | Links nach rechts |
11 | & | Bitweises UND | Links nach rechts |
12 | ^ | Bitweises XOR | Links nach rechts |
13 | | | Bitweises ODER | Links nach rechts |
14 | && | Logisches UND | Links nach rechts |
fünfzehn | || | Logisches ODER | Links nach rechts |
16 | ein ? b: c throw co_yield = + = - = * = / = % = << = >> = & = = | = | Ternärer bedingter Wurfoperator Ertragsausdruck (C ++ 20) Zuordnung Addition Zuordnung Zuordnung Subtraktion Zuordnung Multiplikation Zuweisung Division Zuweisung Modulzuweisung Bitweise Verschiebung Linkszuweisung Bitweise Verschiebung Rechtszuweisung Bitweise UND Zuweisung Bitweise XOR-Zuweisung Bitweise ODER Zuweisung | Rechts nach links |
17 | , | Komma-Operator | Links nach rechts |
Assoziativität der C ++ - Operatoren
Die Operatorassoziativität ist die Richtung, aus der ein Ausdruck ausgewertet wird. Beispielsweise,
int a = 1; int b = 4; // a will be 4 a = b;
Schauen Sie sich die a = 4;
Erklärung an. Die Assoziativität des =
Operators ist von rechts nach links. Daher wird der Wert von b a zugewiesen und nicht in die andere Richtung.
Außerdem können mehrere Operatoren dieselbe Priorität haben (wie aus der obigen Tabelle hervorgeht). Wenn in einem Ausdruck mehrere Operatoren derselben Prioritätsebene verwendet werden, werden sie entsprechend ihrer Assoziativität bewertet .
int a = 1; int b = 4; b += a -= 6;
Sowohl Operatoren +=
als auch -=
Operatoren haben die gleiche Priorität. Da die Assoziativität dieser Operatoren von rechts nach links ist, wird hier die letzte Anweisung bewertet.
a -= 6
wird zuerst ausgewertet. Daher wird a -5 sein- Dann
b += -5
wird ausgewertet. Daher ist b -1
Beispiel 2: Operatorassoziativität
#include using namespace std; int main() ( int a = 1; int b = 4; // a -= 6 is evaluated first b += a -= 6; cout << "a = " << a << endl; ; cout << "b = " << b; )
Ausgabe
a = -5 b = -1