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 * 6
viene valutato per primo.
Di conseguenza, l'espressione sopra è equivalente a
int x = 5 - (17 * 6);
Se vogliamo 5 - 17
prima 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 -= 6
viene valutato per primo. Quindi, a sarà -5- Quindi,
b += -5
verrà 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