Prioritatea operatorilor
Prioritatea operatorilor determina ordinea in care acestia se aplica asupra unei valori. Operatorii C++ sunt impartiti in 18 grupe de prioritate, care va sunt prezentate in Tabelul D.1. Cei din grupa 1 au prioritatea cea mai mare. Daca doi operatori se aplica asupra aceluiasi operand (ceva pe care opereaza un operator), atunci se va aplica mai intai 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 indeaproape de operand. Toti operatorii din aceeasi grupa au aceeasi prioritate si acelasi tip de asociativitate, care este sau de la stanga la dreapta (S–D in tabel), sau de la dreapta la stanga (D–S in tabel). Asociativitatea de la stanga la dreapta presupune aplicarea mai intai a operatorului din stanga, iar asociativitatea de la dreapta la stanga presupune aplicarea mai intai a operatorului din dreapta.
Unele simboluri, cum ar fi * sau &, sunt utilizate pentru mai multi operatori. In 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 in tabel (unar sau binar) pentru cazurile in care acelasi simbol are mai multe semnificatii.
Iata cateva exemple de prioritati si de asociativitate:
3 + 5 * 6
Operatorul * are prioritatea mai mare decat + deci se aplica primul lui 5, expresia devenind 3 + 30, sau 33.
120 / 6 * 5
/ si * au aceeasi prioritate, dar se asociaza de la stanga la dreapta. Adica, operatorul din stanga operandului comun (6) se aplica primul, deci expresia devine 20 * 5, sau 100.
char * sir = “Ho”;
char ch = *sir++; 15173psn97uzd7r
Operatorii unari * si ++ au aceeasi prioritate, dar se asociaza de la dreapta la stanga. 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 in 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 in tabel se noteaza unar sau binar in 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 in C++
Prioritate Operator Asociativitate Explicatie
1 :: Operator de vizibilitate
(expresie) Grupare
2 () 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 in 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
4 .* S-D Dereferentiere a membrului
->* Dereferentiere indirecta a membrului
5(binare) * S-D Inmultire
/ Impartire
^ (N.T.: Trebuie %.) Modulo (rest)
6(binare) + S-D Adunare
- Scadere
7 << S-D Deplasare la stanga
>> Deplasare la dreapta
8 < S-D Mai mic
<= Mai mic sau egal
>= Mai mare sau egal
> Mai mare
9 == S-D Egal
!= Diferit
10(binare) & S-D SI pe biti
11 ^ S-D SAU exclusiv (XOR) pe biti
12 ¦ S-D SAU pe biti
13 && S-D SI logic
14 ¦¦ S-D SAU logic
15 = D-S Atribuire simpla
*= Inmultire si atribuire
/= Impartire 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 stanga si atribuire
>>= Deplasare la dreapta si atribuire
16 :? D-S Conditie
17 throw S-D Arunca exceptie
18 , S-D Combina doua expresii intr-una