Operatori
Notiuni:
operator, operand, operatori unari / binari / ternari, operatori aritmetici / relationali / logici / bitwise / de atribuire / de incrementare / de decrementare / de apel / de indexare / de indirectare / de selectie / de conversie explicita / de adresa de dereferentiere / de alocare, sizeof, operator conditional, operator virgula, prioritatea operatorilor, asociativitatea operatorilor.
Operatorii specifica actiuni ce sunt efectuate asupra operanzilor (constante sau variabile).
Operatorii sunt clasificati în functie de numarul operanzilor în: unari, binari, ternari.
În functie de tipul operanzilor si de scopul expresiei în care sunt folositi, operatorii pot fi
a). Aritmetici
unari:
- (de semn)
binari, aditivi:
(add) - (subtract)
binari, multiplicativi:
(multiply) / (divide) % (modulo)
Operatorul % (modulo) se aplica doar operanzilor de tip întreg si are ca rezultat restul împartirii întregi a operanzilor.
Exemplu: 7 % 4 va avea valoarea 3.
Operatorul / (divide) poate avea atât operanzi întregi cât si reali. Daca ambii operanzi sunt întregi, rezultatul sau va fi câtul împartirii întregi a operanzilor. Daca cel putin un operand este real, rezultatul va fi împartirea reala a operanzilor.
Exemplu: 7 / 4 are rezultatul 1;
7.2 / 4 are rezultatul 1.8;
b). Relationali
< <= > >= == (egalitate) (diferit de)
Se aplica în compararea valorilor operanzilor. Expresiile cu operanzi relationali vor avea valoarea 1 daca expresia este adevarata si 0 daca este 11211k1024l falsa.
c). Logici
negatie) && (si) || (sau)
Sunt folositi în expresii logice.
În C/C++ valorile de adevar sunt codificate numeric astfel 0 pentru fals", 0 pentru adevarat
x |
!x |
0 |
x y x ||
y 0 0 0 0
d). Bitwise
(complement fata de 1, operator unar), & (si), | (sau), ^ (sau exclusiv), << (deplasare spre stânga), >> (deplasare spre dreapta).
Operatorii bitwise realizeaza transformari la nivelul bitilor. Ei reprezinta aplicarea legilor logice pentru fiecare bit component al unui numar.
Tabelele logice ale operatorilor bitwise sunt
x ~x
Exemple: x = 85 = 1010101(2) , y = 123 = 1011011(2)
~x = ~85 = ~1010101 = 0101010
x & y = 1010101 &
x | y = 1010101 |
1011011
1011111
Observatie: Daca operatorii &, | sunt aplicati unor operanzi de lungime (numar de biti) diferita, se va completa operandul de lungime mai mica, cu 0 la stânga, pâna la lungimea celuilalt operand.
Sintaxa operatorilor de deplasare este: <operand> << <nr_biti>
<operand> >> <nr_biti>
Operatorii de deplasare (shift) muta bitii operandului spre stânga dreapta cu un numar dat de biti. Prin mutare bitii din partea stânga / dreapta se pierd iar în partea opusa deplasarii se adauga 0. Magnitudinea ramâne aceeasi.
Exemplu
e). De atribuire
(atribuire simpla += -= *= /= %= &= |= ^= <<= >>= (atribuiri compuse)
Folositi pentru a da unei variabile o valoare
Observati existenta unor operatori de atribuire compusi dintr-un operator aritmetic sau bitwise si operatorul simplu de atribuire. Semnificatia lor este urmatoarea
Fiind dat un operator compus <op>= si doua variabile x si y, expresia x = x <op> y este echivalenta cu expresia x <op>= y
f). De incrementare/decrementare
(incrementare) -- (decrementare)
Acesti operatori sunt unari si realizeaza cresterea descresterea cu o unitate a operandului. Pot fi folositi în forma prefixata (++operand / --operand) sau în forma postfixata (operand++ / operand--). Diferenta dintre cele doua forme apare în expresii în forma prefixata valoarea este mai întâi incrementata si apoi folosita în expresie iar în forma postfixata valoarea este folosita si apoi incrementata.
Observatie Acesti operatori realizeaza modificarea variabilei fara necesitatea unei atribuiri. Fiind data o variabila x, instructiunea x = x + 1 este echivalenta cu instructiunea ++x sau cu x++
g). De apel
Folosit în apelul unei functii.
Sintaxa lui este <nume_functie>(<lista_parametrii>);
h). De indexare
Folosit pentru utilizarea unui element dintr-un tablou.
Sintaxa este <nume_tablou>[<indice>]
<nume_tablou>[<indice_dim1>].[<indice_dimn>]
i). De indirectare
->
Folosit pentru a accesa un membru al unei structuri prin intermediul unui pointer.
Sintaxa: <nume_pointer> -> <nume_membru>
j). De selectie
Folosit pentru a accesa un membru al unei structuri prin intermediul unei variabile.
Sintaxa: <nume_variabila> . <nume_membru>
k). De conversie explicita
(typecast)
Este folosit pentru a realiza conversia unei variabile la alt tip de date decât cel din declaratie.
Sintaxa (<tip_nou>) <nume_variabila>
Observatie: Aceasta conversie este efectuata doar în cadrul expresiei în care este folosit operatorul. Conversia nu se pastreaza în afara expresiei.
l). De adresa
&
Folosit pentru a obtine adresa unei variabile. Sintaxa este &<nume_variabila>
m). De dereferentiere
Folosit pentru a obtine valoarea de la adresa indicata de un pointer. Sintaxa este *<nume_pointer>
n). De alocare
new delete
Folositi în alocarea dinamica a memoriei.
Sintaxele sunt <pointer> = new <tip>;
<pointer> = new <tip>[<dimensiune_1>].[<dimensiune_n>];
delete <pointer>;
Observatie
o). Sizeof
sizeof
Operatorul sizeof returneaza dimensiunea în octeti a unui tip de date.
Sintaxa: sizeof(<tip_de_date> | <nume_variabila>)
Observatie: Sintaxa scrisa în forma de mai sus reprezinta scrierea prescurtata (si mai corecta) a doua sintaxe sizeof(<tip_de_date>) si sizeof(<nume_variabila>). Caracterul | are semnificatia "sau
p). Operatorul conditional
Este singurul operator ternar din C. Sintaxa lui este:
<expresie_conditionala>?<instructiune_adevarat>:<instructiune_fals>
Expresia conditionala va fi evaluata, daca este adevarata se executa prima instructiune iar daca este falsa se executa a doua instructiune.
q). Operatorul virgula
Folosit pentru a lega doua instructiuni într-o singura instructiune.
Sintaxa: <instructiune_1>, <instructiune_2>;
<instructiune_1>, ., <instructiune_n>;
Într-o expresie cu mai multi operatori, ordinea de evaluare este data de prioritate si asociativitate. Prioritatea este structurata pe mai multe nivele iar ordinea de evaluare pentru operatorii de pe acelasi nivel este data de asociativitate. Pentru a modifica explicit ordinea de evaluare se pot folosi parantezele rotunde.
Tabel - prioritatea si asociativitatea operatorilor
Prioritate |
Operator |
Asociativitate |
[ ] -> . | ||
! ~ + - ++ -- * & (typecast) sizeof new delete | ||
<< >> | ||
< <= > >= | ||
& | ||
&& | ||
= += -= *= /= %= &= ^= |= <<= >>= | ||
|