Prioritatea operatorilor
Prioritatea operatorilor determina ordinea în care acestia se aplica asupra unei valori. Operatorii C++ sunt împartiti în 18 grupe de prioritate, care va sunt prezentate în Tabelul D.1. Cei din grupa 1 au prioritatea cea mai mare. Daca doi operatori se aplica asupra aceluiasi operand (ceva pe care opereaz 15215h717p a un operator), atunci se va aplica mai întâi operatorul cu prioritatea mai mare. Daca cei doi operatori au aceeasi prioritate, C++ va folosi reguli de asociativitate pentru a determina care operator este legat mai îndeaproape de operand. Toti operatorii din aceeasi grupa au aceeasi prioritate si acelasi tip de asociativitate, care este sau de la stânga la dreapta (S-D în tabel), sau de la dreapta la stânga (D-S în tabel). Asociativitatea de la stânga la dreapta presupune aplicarea mai întâi a operatorului din stânga, iar asociativitatea de la dreapta la stânga presupune aplicarea mai întâi a operatorului din dreapta.
Unele simboluri, cum ar fi sau &, sunt utilizate pentru mai multi operatori. În acest caz, unul dintre operatori este unar (se aplica unui singur operand), iar celalalt este binar (se aplica la doi operanzi), iar compilatorul determina din context care se aplica. Grupele de operatori sunt etichetate în tabel (unar sau binar) pentru cazurile în care acelasi simbol are mai multe semnificatii.
Iata câteva exemple de prioritati si de asociativitate:
3 + 5 * 6
Operatorul are prioritatea mai mare decât deci se aplica primul lui , expresia devenind , sau
120 / 6 * 5
si au aceeasi prioritate, dar se asociaza de la stânga la dreapta. Adica, operatorul din stânga operandului comun (6) se aplica primul, deci expresia devine , sau
char * sir = "Ho";
char ch = *sir++;
Operatorii unari si au aceeasi prioritate, dar se asociaza de la dreapta la stânga. Adica, operatorul de incrementare opereaza asupra lui sir si nu asupra lui *sir. Deci, operatia incrementeaza pointerul, care va indica urmatorul caracter, si nu modifica valoarea caracterului indicat. Totusi, deoarece este în forma postfixata, pointerul este incrementat dupa ce valoarea originala a lui *sir a fost atribuita lui ch. Prin urmare, expresia atribuie lui ch caracterul H iar apoi modifica pointerul sir sa indice caracterul o
Observati ca în tabel se noteaza unar sau binar în coloana de prioritate pentru a putea deosebi doi operatori care folosesc acelasi simbol, cum ar fi operatorul de adresa unar si operatorul binar sI pe biti.
Tabelul D.1 Prioritatea si asociativitatea operatorilor în C++
Prioritate Operator Asociativitate Explicatie
Operator de vizibilitate
(expresie) Grupare
S-D Apel de functie
Constructie de valoare, adica type (expr)
Indici de tablou
-> Operator de apartenenta indirect
Operator de apartenenta direct
const_cast Conversie de tip specializata
dynamic_cast Conversie de tip specializata
reinterpret_cast Conversie de tip specializata
static_cast Conversie de tip specializata
typeid Identificare de tip
Operator de incrementare, postfixat
Operator de decrementare, postfixat
3(unare) D-S Negare logica
Negare pe biti
Plus unar (semn pozitiv)
Minus unar (semn negativ)
Operator de incrementare, prefixat
Operator de decrementare, prefixat
& Adresa
Dereferentiere (valoare indirecta)
Modificare de tip, adica (type) expr
sizeof Dimensiunea în octeti
new Alocare dinamica de memorie
new [] Alocare dinamica a unui tablou de memorie
delete Eliberare dinamica a memoriei
delete [] Eliberare dinamica a unui tablou de memorie
S-D Dereferentiere a membrului
->* Dereferentiere indirecta a membrului
5(binare) S-D Înmultire
Împartire
(N.T.: Trebuie Modulo (rest)
6(binare) S-D Adunare
Scadere
<< S-D Deplasare la stânga
>> Deplasare la dreapta
< S-D Mai mic
<= Mai mic sau egal
>= Mai mare sau egal
> Mai mare
S-D Egal
Diferit
10(binare) & S-D sI pe biti
S-D SAU exclusiv (XOR) pe biti
S-D SAU pe biti
&& S-D sI logic
S-D SAU logic
D-S Atribuire simpla
Înmultire si atribuire
Împartire si atribuire
Modulo si atribuire
Adunare si atribuire
Scadere si atribuire
&= sI pe biti si atribuire
SAU exclusiv (XOR) pe biti si atribuire
SAU pe biti si atribuire
<<= Deplasare la stânga si atribuire
>>= Deplasare la dreapta si atribuire
D-S Conditie
throw S-D Arunca exceptie
S-D Combina doua expresii într-una
|