Precedența și asociativitatea operatorului C ++

În acest tutorial, vom afla despre prioritatea și asociativitatea operatorilor în C ++ cu ajutorul exemplelor.

Precedența operatorilor C ++

Dacă există mai mulți operatori într-o singură expresie, operațiile nu sunt evaluate simultan. Mai degrabă, operatorii cu prioritate mai mare își evaluează operațiunile mai întâi.

Să luăm în considerare un exemplu:

 int x = 5 - 17 * 6; 

Aici, operatorul de multiplicare *are o prioritate de nivel mai înalt decât operatorul de scădere -. Prin urmare, 17 * 6este evaluat mai întâi.

Ca urmare, expresia de mai sus este echivalentă cu

 int x = 5 - (17 * 6);

Dacă dorim să evaluăm mai 5 - 17întâi, atunci trebuie să le încadrăm între paranteze :

 int x = (5 - 17) * 6;

Exemplul 1: Precedența operatorilor

 #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; )

Ieșire

 num1 = -97 num2 = -97 num3 = -72

Notă: Deoarece există o mulțime de operatori în C ++ cu mai multe niveluri de prioritate, este foarte recomandat să folosim paranteze pentru a face codul nostru mai lizibil.

Tabelul de precedență al operatorilor C ++

Următorul tabel (preluat de pe cppreference.com) arată prioritatea operatorilor C ++. Precedence Level 1 semnifică operatorii cu cea mai mare prioritate, în timp ce Precedence Level 17 semnifică operatorii cu cea mai mică prioritate.

Proprietatea asociativității va fi discutată în scurt timp.

Precedenta Operator Descriere Asociativitate
1 :: Rezoluția domeniului De la stânga la dreapta
2 a ++
a--
type ()
type ()
a ()
a ()
.
->
Suffix / postfix increment
Suffix / postfix decrement
Funcție cast
Funcție cast
Funcție apel Apel
subindice
Acces membru dintr-un obiect
Acces membru din obiect ptr
De la stânga la dreapta
3 ++ a
--a
+ a
-a
!
~
(tip)
* a
& a
sizeof
co_aait
new new ()
șterge șterge ()
Incrementarea
prefixului Decrementul prefixului
Unar plus
Unar minus
Logic NU
Bitwise NU
C turnat
Indirecție (dereferență)
Adresă-
Mărime
-expresie-așteptare
Alocare
dinamică a memoriei Alocare dinamică a memoriei
De la dreapta la stanga
4 . *
-> *
Selector de obiect
membru Selector de pointer membru
De la stânga la dreapta
5 a * b
a / b
a% b
Modulul
Diviziei de multiplicare
De la stânga la dreapta
6 a + b
a - b
Adăugarea
Scadere
De la stânga la dreapta
7 <<
>>
Deplasare stânga spre
dreapta
De la stânga la dreapta
8 <= < Operator de comparație cu trei căi De la stânga la dreapta
9 <
<=
>
> =
Less than
Less than or equal to
Greater than
Greater than or equal to
Left to Right
10 ==
!=
Equal to
Not equal to
Left to Right
11 & Bitwise AND Left to Right
12 ^ Bitwise XOR Left to Right
13 | Bitwise OR Left to Right
14 && Logical AND Left to Right
15 || Logical OR Left to Right
16 a ? b : c
throw
co_yield
=
+=
-=
*=
/=
%=
<<=
>>=
&=
^=
|=
Ternary Conditional
throw operator
yield expression (C++ 20)
Assignment
Addition Assignment
Subtraction Assignment
Multiplication Assignment
Division Assignment
Modulus Assignment
Bitwise Shift Left Assignment
Bitwise Shift Right Assignment
Bitwise AND Assignment
Bitwise XOR Assignment
Bitwise OR Assignment
Right to Left
17 , Comma operator Left to Right

C++ Operators Associativity

Operator associativity is the direction from which an expression is evaluated. For example,

 int a = 1; int b = 4; // a will be 4 a = b;

Take a look at a = 4; statement. The associativity of the = operator is from right to left. Hence, the value of b is assigned to a, and not in the other direction.

De asemenea, mai mulți operatori pot avea același nivel de prioritate (așa cum putem vedea din tabelul de mai sus). Când într-o expresie sunt utilizați mai mulți operatori de același nivel de prioritate, aceștia sunt evaluați în funcție de asociativitatea lor .

 int a = 1; int b = 4; b += a -= 6;

Atât operatorii, cât +=și -=operatorii au aceeași prioritate. Deoarece asociativitatea acestor operatori este de la dreapta la stânga, iată cum este evaluată ultima afirmație.

  • a -= 6este evaluat mai întâi. Prin urmare, a va fi -5
  • Apoi, b += -5va fi evaluat. Prin urmare, b va fi -1

Exemplul 2: Asociativitatea operatorilor

 #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; )

Ieșire

 a = -5 b = -1

Articole interesante...