Î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 * 6
este 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 -= 6
este evaluat mai întâi. Prin urmare, a va fi -5- Apoi,
b += -5
va 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