Vorrang und Assoziativität von C ++ - Operatoren

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 * 6wird zuerst ausgewertet.

Infolgedessen ist der obige Ausdruck äquivalent zu

 int x = 5 - (17 * 6);

Wenn wir 5 - 17zuerst 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 -= 6wird zuerst ausgewertet. Daher wird a -5 sein
  • Dann b += -5wird 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

Interessante Beiträge...