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