Prioritatea operatorilor



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