Precedenza e associatività degli operatori C ++

In questo tutorial, impareremo la precedenza e l'associatività degli operatori in C ++ con l'aiuto di esempi.

Precedenza degli operatori C ++

Se sono presenti più operatori in una singola espressione, le operazioni non vengono valutate contemporaneamente. Piuttosto, le operazioni vengono valutate per prime agli operatori con precedenza maggiore .

Prendiamo in considerazione un esempio:

 int x = 5 - 17 * 6; 

In questo caso, l'operatore di moltiplicazione ha *una precedenza di livello superiore rispetto all'operatore di sottrazione -. Quindi, 17 * 6viene valutato per primo.

Di conseguenza, l'espressione sopra è equivalente a

 int x = 5 - (17 * 6);

Se vogliamo 5 - 17prima valutare , dobbiamo racchiuderli tra parentesi :

 int x = (5 - 17) * 6;

Esempio 1: precedenza degli operatori

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

Produzione

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

Nota: poiché ci sono molti operatori in C ++ con più livelli di precedenza, si consiglia vivamente di utilizzare le parentesi per rendere il nostro codice più leggibile.

Tabella di precedenza degli operatori C ++

La tabella seguente (presa da cppreference.com) mostra la precedenza degli operatori C ++. Il livello di precedenza 1 indica gli operatori con la priorità più alta, mentre il livello di precedenza 17 indica gli operatori con la priorità più bassa.

La proprietà dell'associatività verrà discussa a breve.

Precedenza Operatore Descrizione Associatività
1 :: Risoluzione dell'ambito Da sinistra a destra
2 a ++
a--
tipo ()
tipo ()
a ()
a ()
.
->
Suffisso / suffisso incremento
Suffisso / suffisso decremento
Funzione cast
Funzione cast
Chiamata di funzione
Indice
Accesso ai membri da un oggetto
Accesso ai membri dall'oggetto ptr
Da sinistra a destra
3 ++ a
--a
+ a
-a
!
~
(type)
* a
& a
sizeof
co_await
new new ()
delete delete ()
Incremento
prefisso Decremento prefisso
Unario più
unario meno
Logico NOT
Bit per bit NOT
Cast in stile C
Indirection (dereference)
Address-of
Size-of
await-expression
Allocazione
dinamica della memoria Deallocazione dinamica della memoria
Da destra a sinistra
4 . *
-> *
Selettore oggetto
membro Selettore puntatore membro
Da sinistra a destra
5 a * b
a / b
a% b
Modulo di
divisione di moltiplicazione
Da sinistra a destra
6 a + b
a - b
Addizione
Sottrazione
Da sinistra a destra
7 <<
>>
Spostamento bit a sinistra a sinistra Spostamento
bit a destra a destra
Da sinistra a destra
8 <= < Operatore di confronto a tre vie Da sinistra a destra
9 <
<=
>
> =
Minore di
Minore o uguale a
Maggiore di
Maggiore o uguale a
Da sinistra a destra
10 ==
! =
Uguale a
Non uguale a
Da sinistra a destra
11 & Bitwise AND Da sinistra a destra
12 ^ Bitwise XOR Da sinistra a destra
13 | OR bit per bit Da sinistra a destra
14 && AND logico Da sinistra a destra
15 || OR logico Da sinistra a destra
16 a? b: c
lancia
co_yield
=
+ =
- =
* =
/ =
% =
<< =
>> =
& =
=
| =
Espressione di resa
dell'operatore di lancio condizionale ternario
(C ++ 20)
Assegnazione
Assegnazione Assegnazione Assegnazione
sottrazione Assegnazione
moltiplicazione Assegnazione
divisione Assegnazione
modulo Assegnazione
Spostamento bit a sinistra Assegnazione
Spostamento bit a destra Assegnazione
AND
bit a bit Assegnazione XOR
bit Assegnazione OR bit a bit Assegnazione OR bit a bit
Da destra a sinistra
17 , Operatore virgola Da sinistra a destra

Associatività degli operatori C ++

L'associatività degli operatori è la direzione dalla quale viene valutata un'espressione. Per esempio,

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

Dai un'occhiata alla a = 4;dichiarazione. L'associatività =dell'operatore va da destra a sinistra. Quindi, il valore di b è assegnato ad a, e non nell'altra direzione.

Inoltre, più operatori possono avere lo stesso livello di precedenza (come possiamo vedere dalla tabella sopra). Quando in un'espressione vengono utilizzati più operatori dello stesso livello di precedenza, vengono valutati in base alla loro associatività .

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

Sia gli operatori +=che gli -=operatori hanno la stessa precedenza. Poiché l'associatività di questi operatori va da destra a sinistra, ecco come viene valutata l'ultima istruzione.

  • a -= 6viene valutato per primo. Quindi, a sarà -5
  • Quindi, b += -5verrà valutato. Quindi, b sarà -1

Esempio 2: Associatività degli operatori

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

Produzione

 a = -5 b = -1

Articoli interessanti...