OPERATORI ŞI EXPRESII
Datele (constante sau variabile) legate prin operatori, formează expresii .Operatorii care pot fi aplicaţi datelor (operanzilor) depind de tipul operanzilor, datorită faptului că tipul unei date constă într-o mulţime de valori pentru care s-a adoptat un anumit mod de reprezentare în memoria calculatorului şi o mulţime de operatori care pot fi aplicaţi acestor valori.
Operatorii pot fi:
-) unari (necesită un singur operand);
-) binari (necesită doi operanzi);
-) ternari (trei operanzi).
O expresie este o combinaţie corectă din punct de vedere sintactic, formată din operanzi şi operatori. Expresiile, ca şi operanzii, au tip şi valoare.
OPERATORI
-) Operatorul unar adresă &,
Aplicat identificatorului unei variabile, furnizează adresa la care este memorată aceasta. Poate fi aplicat oricărui tip de date şi se mai numeşte operator de referenţiere.
Exemplu:
int a;
cout<<“Adresa la care este memorata variabila a este:”<<&a;
-) Operatorul de atribuire (de asignare)
Este un operator binar care se aplică tuturor tipurilor de variabile. Este folosit sub formele următoare:
nume_variabilă=expresie;
sau: expresie1=expresie2;
Se evaluează expresia din membrul drept, iar valoarea acesteia este atribuită variabilei din membrul stâng. Dacă tipurile membrilor stâng şi drept diferă, se pot realiza anumite conversii
Exemplu:
float x; int a,b; x=9.18;
a=b=10;
int s; s=a+20*5; //rezultat: s=110
s=x+2; //rezultat s=11, deoarece s este int.
Aşa cum se observă în linia a 2-a din exemplul precedent, operatorul de atribuire poate fi utilizat de mai multe ori în aceeaşi expresie. Asociativitatea operatorului are loc de la dreapta la stânga. Astfel, mai întâi b=10, apoi a=b.
Exerciţiu: Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.
#include <iostream.h>
void main()
{
float x,y=4.25; char car=’A’; int a,b,c;
cout<<”Val. lui y este:”<<y<<’\n’; //Afişare: Val. lui y este:4.25
x=y; cout<<”Val. lui x este:”<<x<<’\n’; //Afişare: Val. lui x este:4.25
a=x;cout<<”Val.lui a este:”<<a<<’\n’; //Afişare:Val. lui a este:4, deoarece a de tip int!!!
c=b=a; cout<<”b=”<<b<<”\tc=”<<c<<’\n’; //Afişare: b=4 c=4
cout<<”Introduceţi val. lui c:”; cin>>c; // citire val. pentru c
cout<<”Val. lui c este:”<<c<<’\n’; //Afişare: Val. lui c este:4
}
Operatorul poate fi aplicat tipurilor de date întregi, reale, caracter, şi chiar şiruri de caractere (exemplu: char şir [10]= =”a5dfgthklj”).
-) Operatori aritmetici unari:
Operator Semnificaţie Exemple
– Minus unar -a
++ Operator de incrementare a++ sau
(adună 1 la valoarea operandului) ++a
— Operator de decrementare a– sau
(scade 1 din valoarea operandului) –a
-) Operatorul – unar schimbă semnul operandului.
Exemplu:
int a,b; cout<<”a=”<<-a<<’\n’; b=-a;
cout<<”b=”<<b<<’\n’;
Operatorul – unar poate fi aplicat datelor întregi, reale, caracter.
-) Operatorii de incrementare şi decrementare
pot fi aplicaţi datelor numerice sau caracter.
Ambii operatori pot fi folosiţi în formă prefixată, înaintea operandului, (++a, respectiv –a) sau postfixată, după operand (a++, respectiv a–).
Operatorul de decrementare — care poate fi folosit în formă prefixată (–a) sau postfixată (a–).
Utilizarea acestor operatori în expresii, în formă prefixată sau postfixată, determină evaluarea acestora în moduri diferite, astfel:
y=++x este echivalent cu: x=x+1;
y=x;
y=x++ este echivalent cu: y=x;
x=x+1;
y=–x este echivalent cu: x=x-1;
y=x;
y=x– este echivalent cu: y=x;
x=x-1;
Exerciţiu: Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.
#include <iostream.h>
void main()
{ int a=9; cout<<”a++=”<<a++<<’\n’; //Afişare: a++=9
cout<<”a=”<<a<<’\n’; //Afişare: a=10
a=9; //Revenire in situatia anterioara
cout<<”++a=”<<++a<<’\n’; //Afişare: ++a=10
cout<<”a=”<<a<<’\n’; //Afişare: a=10
a=9; cout<<”a–=”<<a–<<’\n’; //Afişare: a–=9
cout<<”a=”<<a<<’\n’; //Afişare: a=8
a=9; //Revenire in situaţia anterioara
cout<<”–a=”<<–a<<’\n’; //Afişare: –a=8
cout<<”a=”<<a<<’\n’; //Afişare: a=8
int z,x=3; z=x++-2;
cout<<”z=”<<z<<’\n’; //Afişare: z=1
cout<<“x=”<<x<<’\n’; //Afişare: x=4
x=3; z=++x-2; cout<<”z=”<<z<<’\n’; //Afişare: z=2
cout<<“x=”<<x<<’\n’; //Afişare: x=4
}
-) Operatori aritmetici binari:
Operator Semnificaţie Exemple
+ Adunarea celor doi operanzi a+b
– Scăderea celor doi operanzi a-b
* Înmulţirea celor doi operanzi a*b
/ Împărţirea celor doi operanzi a/b
% Operatorul modulo (operatorul rest) a%b (furnizează restul împărţirii operatorului stâng la operatorul drept).
Operatorul modulo se aplică numai operanzilor întregi (de tip int sau char). Ceilalţi operatori aritmetici binari pot fi aplicaţi datelor întregi sau reale.
Dacă într-o expresie cu 2 operanzi şi un operator binar aritmetic, ambii operanzi sunt întregi, rezultatul expresiei va fi tot un număr întreg. De exemplu, la evaluarea expresiei 9/2, ambii operanzi fiind întregi, rezultatul furnizat este numărul întreg 4.
Operatorii prezentaţi respectă o serie de reguli de precedenţă (prioritate) şi asociativitate, care determină precis modul în care va fi evaluată expresia în care aceştia apar. În tabel sunt prezentaţi operatorii anteriori, în ordinea descrescătoare a priorităţii. Precedenţa operatorilor poate fi schimbată cu ajutorul parantezelor.
Clasă de operatori |
Operatori |
Asociativitate |
Unari |
– (unar) ++ — |
de la dreapta la stânga |
Multiplicativi |
* / % |
de la stânga la dreapta |
Aditivi |
+ – |
de la stânga la dreapta |
Atribuire |
= |
de la dreapta la stânga |
Exerciţiu: Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.
#include <iostream.h>
void main()
{
int rezult, a=20,b=2,c=25,d=4; rezult=a-b;
cout<<”a-b=”<<rezult<<’\n’; // Afişare: a-b=18
rezult=a+b; cout<<”a+b=”<<rezult<<’\n’; // Afişare: a+b=22
rezult=a*b;cout<<”c*b=”<<rezult<<’\n’; // Afişare: c*b=50
rezult=a/d; cout<<”a/d=”<<rezult<<’\n’; // Afişare: a/d=5
rezult=c%b; cout<<”c%b=”<<rezult<<’\n’; // Afişare: c%b=1
rezult=c/b*d; cout<<”c/b*d=”<<rezult<<’\n’; // Afişare: c/b*d=48
rezult= -b+a; cout<<”-b+a=”<<rezult<<’\n’; // Afişare: -b+a=18
rezult= -(b+a); cout<<”-(b+a)=”<<rezult<<’\n’; // Afişare: -(b+a)=-22
rezult=b+c*d;cout<<”b+c*d=”<<rezult<<’\n’; // Afişare: b+c*d=102
rezult=(b+c)*d;cout<<”(b+c)*d=”<<rezult<<’\n’; // Afişare: (b+c)*d=108
}
-) Operatori aritmetici binari compuşi
Operator Semnificaţie Exemple
+= a=a+b a+=b
-= a=a+b a-=b
*= a=a*b a*=b
/= a=a/b a/=b
%= a=a%b a%=b
Aceşti operatori se obţin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire şi sunt folosiţi sub forma următoare:
expresie1 operator= expresie2;
Rezultatul obţinut este acelaşi cu rezultatul obţinut prin:
expresie1 = expresie1 operator expresie2;
Toţi aceşti operatorii modifică valoarea operandului stâng prin adunarea, scăderea, înmulţirea sau împărţirea acestuia prin valoarea operandului drept.
Construcţia x+=1 generează acelaşi rezultat ca expresia x=x+1.
Observaţiile referitoare la operatorii aritmetici binari sunt valabile şi pentru operatorii aritmetici binari compuşi. Operatorii aritmetici binari compuşi au aceeaşi prioritate şi asociativitate ca şi operatorul de atribuire.
Exerciţiu: Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.
#include <iostream.h>
void main()
{
int a,b; float c=9.3; a=3; b=8;
cout<<”a=”<<a<<’\n’; //Afişare a=3
a+=b; cout<<”a=”<<a<<’\n’; //Afişare a=11
a-=b; cout<<”a=”<<a<<’\n’; //Afişare a=-5
a*=b; cout<<”a=”<<a<<’\n’; //Afişare a=24
a/=b; cout<<”a=”<<a<<’\n’; //Afişare a=0
a%=b; cout<<”a=”<<a<<’\n’; //Afisare a=3
}
-) Operatori relaţionali binari
Operator Semnificaţie Exemple
== Egal cu a==b
!= Diferit de a!=b
< Mai mic decât a<b
<= Mai mic sau egal a<=b
> Mai mare decât a>b
>= Mai mare sau egal a>=b
Primii doi operatori mai sunt numiţi operatori de egalitate. Operatorii relaţionali servesc la compararea valorilor celor doi operanzi şi nu modifică valorile operanzilor. Rezultatul unei expresii în care apare unul din operatorii relaţionali binari este întreg şi are valoarea zero (0) dacă relaţia este falsă, sau valoarea unu (1) (sau diferită de 0 în cazul compilatoarelor sub UNIX), dacă relaţia este adevărată. Aceşti operatorii pot fi aplicaţi datelor de tip întreg, real sau char.Regulile de precedenţă şi asociativitate ale acestor operatori sunt prezentate în tabel.
Clasă de operatori |
Operatori |
Asociativitate |
Unari |
– (unar) ++ — |
de la dreapta la stânga |
Multiplicativi |
* / % |
de la stânga la dreapta |
Aditivi |
+ – |
de la stânga la dreapta |
Atribuire |
= |
de la dreapta la stânga |
Relaţionali |
< <= > >= |
de la stânga la dreapta |
De egalitate |
== != |
de la stânga la dreapta |
Atribuire şi aritmetici binari |
= *= /= %= += -= |
de la dreapta la stânga |
Observaţie: Deosebirea dintre operatorii == (relaţional, de egalitate) şi = (de atribuire) constă în faptul că primul nu modifică valoarea nici unuia dintre operanzii săi, pe când cel de-al doilea modifică valoarea operandului stâng (vezi exemplul următor)
Exerciţiu: Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.
#include <iostream.h>
void main()
{
int a=1, b=20, lim=100; int rezult; rezult=a<b;
cout<<”a<b=”<<rezult<<’\n’;
// Afişare: a<b=1 (sau o altă valoare diferită de zero pentru alte compilatoare)
rezult=a<=b;
//operatorul realţional <= are prioritate mai mare decât cel de atribuire
cout<<”a<=b=”<<rezult<<’\n’;
// Afisare: a<b=1 (sau o alta valoare diferită de zero pentru alte compilatoare)
rezult=a>b; cout<<”a>b=”<<rezult<<’\n’; // Afişare: a<b=0
rezult=a+10>=lim; cout<<”a+10>=lim=”<<rezult<<’\n’;
/* Operatorul + are prioritate mai mare decât operatorul >= . Afişare: a+10>=lim=0 */
rezult=a+(10>=lim); cout<<”a+(10>=lim)=”<<rezult<<’\n’;
/* Schimbarea prioritatii operatorilor prin folosirea parantezelor; Afişare: a+(10>=lim)=1 */
rezult=a==b;
cout<<”a==b=”<<rezult<<’\n’; // Afişare: a==b=0
cout<<”a=”<<a<<’\n’; // Afişare: a=1
cout<<”b=”<<b<<’\n’; // Afişare: b=20
rezult=a=b; cout<<”a=b=”<<rezult<<’\n’; // Afişare: a=b=20
cout<<”a=”<<a<<’\n’; // Afişare: a=20
cout<<”b=”<<b<<’\n’; // Afişare: b=20
rezult=5>b>10;cout<<”b=”<<b<<’\n’; // Afişare: b=20
cout<<”5>b>10=”<<rezult<<’\n’; //Echivalent cu (5>b)>10 Afişare: 5>b>10=0
}
-) Operatori logici pe cuvânt
Operator Semnificaţie Exemple
! Not (negaţie logică) !(a==b)
&& And (conjuncţie, şi logic) (a>b) && (b>c)
|| Or (disjuncţie, sau logic) (a>b) || (b>c)
Aceşti operatori pot fi aplicaţi datelor de tip întreg, real sau caracter. Evaluarea unei expresii în care intervin operatorii logici se face conform tabelului.
x |
y |
!x |
x&&y |
x||y |
adevărat (1) |
adevărat (1) |
fals (0) |
adevărat (1) |
adevărat (1) |
adevărat (1) |
fals (0) |
fals (0) |
fals (0) |
adevărat (1) |
fals (0) |
adevărat (1) |
adevărat (1) |
fals (0) |
adevărat (1) |
fals (0) |
fals (0) |
adevărat (1) |
fals (0) |
fals (0) |
Expresia !expresie are valoarea 0 (fals) dacă expresia-operand are o valoare diferită de zero şi valoarea unu (adevărat) dacă expresia-operand are valoarea zero.
Expresia expresie1||expresie2 are valoarea diferită de 0 (true) dacă FIE expresie1, FIE expresie2 au valori diferite de zero.
Expresia expresie1 && expresie2 are valoarea diferită de 0 (true) dacă AMBELE expresii-operand ( expresie1 şi expresie2) au valori diferite de zero.
Exerciţiu: Să se scrie următorul program şi să se urmărească rezultatele execuţiei acestuia.
#include <iostream.h>
void main()
{ int a=0, b=10, c=100, d=200; int rezult; rezult=a&&b;
cout<<”a&&b=”<<rezult<<’\n’; //Afişare a&&b=0
rezult=a||b; cout<<”a||b=”<<rezult<<’\n’;//Afişare a||b=1 (sau valoare nenula)
rezult=!a;cout<<”!a=”<<rezult<<’\n’; //Afişare !a=1 (sau valoare nenula)
rezult=!b; cout<<”!b=”<<rezult<<’\n’; //Afişare !b=0
rezult=(a>b) || (b>c);cout<<”(a>b) || (b>c)=”<<rezult<<’\n’;
//Afişare (a>b) || (b>c) =1(sau valoare nenula)
rezult=!(c<d);cout<<”!(c<d)=”<<rezult<<’\n’;//Afişare !(c>d)=0
rezult=(a-b)&&1;cout<<”(a-b)&&1=”<<rezult<<’\n’;
//Afişare (a-b)&&1 =1(sau valoare nenula)
rezult=d||b&&a;cout<<”d||b&&a=”<<rezult<<’\n’;//Afişare d||b&&a =1
}// În evaluarea expresiilor din exemplu, s-au aplicat priorităţile operatorilor, indicate în tabel.
Clasă de operatori |
Operatori |
Asociativitate |
Unari |
! – (unar) ++ — |
de la dreapta la stânga |
Multiplicativi |
* / % |
de la stânga la dreapta |
Aditivi |
+ – |
de la stânga la dreapta |
Atribuire |
= |
de la dreapta la stânga |
relaţionali |
< <= > >= |
de la stânga la dreapta |
de egalitate |
== != |
de la stânga la dreapta |
logici |
&& |
de la stânga la dreapta |
logici |
|| |
de la stânga la dreapta |
atribuire şi aritmetici binari |
= *= /= %= += -= |
de la dreapta la stânga |
Exerciţiu: Să se scrie un program care citeşte un număr real şi afişează 1 dacă numărul citit aparţine unui interval ale cărui limite sunt introduse tot de la tastatură, sau 0 în caz contrar.
#include <iostream.h>
void main()
{
double lmin, lmax, nr;cout<<“Numar=”;cin>>nr;
cout<<”Limita inferioară a intervalului:”; cin>>lmin;
cout<<”Limita superioară a intervalului:”; cin>>lmax;
cout<<(nr>=lmin && nr<=lmax); }
-) Operatori logici pe bit
Operator Semnificaţie Exemple
~ Negaţie (cod complementar faţă de unu) ~a
& AND (Conjuncţie, şi logic pe bit a & 0377
| OR (Disjuncţie, sau logic pe bit) a | 0377
^ XOR (Sau exclusiv logic pe bit) a^b
<< Deplasare stânga 0377 << 2
>> Deplasare dreapta 0377 >> 2
Aceşti operatori nu se aplică numerelor reale, ci numai datelor de tip întreg sau caracter. Primul operator este unar, ceilalţi binari. Operatorii acţionează la nivel de bit, la nivelul reprezentării interne (în binar), conform tabelelului
x |
y |
x&y |
x | y |
x^y |
~x |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
Operatorul ~ are aceeaşi prioritate ca şi ceilalţi operatori unari. El furnizează complementul faţă de unu al unui întreg, adică va schimba fiecare bit de pe 1 în zero şi invers. Operatorii de deplasare pe bit (<< şi >>) efectuează deplasarea la stânga sau la dreapta a operandului stâng, cu numărul de biţi indicaţi de operandul drept. Astfel, x<<2 deplasează biţii din x la stânga, cu două poziţii, introducând zero pe poziţiile rămase vacante.
Exemple:
int a=3; //Reprezentare internă a lui a (pe 2 octeţi): 0000000000000011
int b=5; //Reprezentare internă a lui b (pe 2 octeţi): 0000000000000101
int rez=~a;
cout<<“~”<<a<<‘='<<rez<<‘\n’; //~3= -4
//Complementul faţă de unu este: 1111111111111100 (în octal: 0177777774 (!a= – 4)
rez=a & b; cout<<a<<‘&'<<b<<‘='<<rez<<‘\n’; //3&5=1
//a&b=0000000000000001 =1
rez=a^b; cout<<a<<‘^'<<b<<‘='<<rez; // 3^5= 6
//a ^b = 0000000000000110
rez=a|b; cout<<a<<‘|'<<b<<‘='<<rez; //3|5= 7
//a | b = 0000000000000111
rez=a<<2; cout<<a<<“<<“<<3<<‘='<<rez; //3<<2=16=2*2
//a<<2= 0000000001100000
rez=5>>2; cout<<b<<“>>”<<2<<‘='<<rez; //5>>2=1=5/2
//b>>2= 0000000000000001
Operatorul binar ^ îşi găseşte o utilizare tipică în expresii ca: x&^077, care maschează ultimii 6 biţi ai lui x pe zero.
Operatorul & este adesea utilizat în expresii ca x&0177, unde setează toţi biţii pe zero, cu excepţia celor de ordin inferior din x.
Operatorul | este utilizat în expresii ca: x&MASK , unde setează pe unu biţii care în x şi masca MASK sunt setaţi pe unu.
Operatorii logici pe bit & şi | sunt diferiţi de operatorii logici && şi || (pe cuvânt).
Deplasarea la stânga a unei date cu n poziţii este echivalentă cu înmulţirea valorii acesteia cu 2. Deplasarea la dreapta a unei date fără semn cu n poziţii este echivalentă cu împărţirea valorii acesteia cu 2.
Combinând operatorii logici pe bit cu operatorul de atribuire, se obţin operatorii: &=, ^=, |=, <<=, >>=.
-) Operatorul condiţional
Este un operator ternar (necesită 3 operanzi), utilizat în construcţii de forma:
expresie1?expresie2:expresie3
Se evaluează expresia1. Dacă aceasta are o valoare diferită de zero, atunci tipul şi valoarea întregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei2. Altfel (dacă expresie1 are valoarea zero), tipul şi valoarea întregii expresii vor fi aceleaşi cu tipul şi valoarea expresiei3. Deci operatorul condiţional este folosit pentru a atribui întregii expresii tipul şi valoarea expresiei2 sau a expresiei3, în funcţie de o anumită condiţie. Acest lucru este echivalent cu:
Dacă expresie1 diferită de zero
Atunci evaluează expresie2
Altfel evaluează expresie3
Exemplu:
int semn=(x<0)?-1:1
Dacă x<0, atunci semn=-1, altfel semn=1.
-) Operatorul virgulă
Este utilizat în construcţii de forma:
expresie1 , expresie2
Operatorul virgulă forţează evaluarea unei expresii de la stânga la dreapta. Tipul şi valoarea întregii expresii este dată de tipul şi valoarea expresiei2. Operatorul virgulă este folosit în instrucţiunea for. Operatorul virgulă are cea mai mică prioritate.
Exemplu:
int x, c, y;
cout<<”Astept val. ptr. y:”; cin>>y;
x=(c=y, c<=5); /* c va primi valoarea lui y (citită); se verifică dacă c este mai mic sau
egal cu 5. Daca nu, x=0; daca da, x=1 sau x=valoare diferită de zero)*/
x++, y–; //întâi este incrementat x, apoi este decrementat y
-) Operatorul sizeof()
Este un operator unar, care are ca rezultat numărul de octeţi pe care este memorată o dată de un anumit tip. Operandul este un tip sau o dată (constantă sau variabilă) de un anumit tip.
Exemple:
cout<<sizeof(int); // afişează numărul de octeţi pe care este memorat un întreg (2)
cout<<sizeof(”ab6*”);// afişează 5, nr. de octeţi pe care este memorată constanta şir ”ab6*”
-) Operatorul (tip)
Este un operator unar care apare în construcţii numite ”cast” şi converteşte tipul operandului său la tipul specificat între paranteze.
Exemple:
int a; (float) a; // converteşte operandul a (care era de tip întreg) în float
În afara operatorilor prezentaţi, există şi alţii, pe care îi vom enumera în continuare. Despre aceşti operatori vom discuta în capitolele viitoare, când cunoştinţele acumulate vor permite acest lucru.
-) Operatorul unar *
Este operator unar, numit şi operator de deferenţiere. Se aplică unei expresii de tip pointer şi este folosit pentru a accesa conţinutul unei zone de memorie spre care pointează operatorul. Operatorii & (adresă) şi * sunt complementari.
Exemplu: Expresia *a este înlocuită cu valoarea de la adresa conţinută în variabila pointer a.
-) Operatorii paranteză
Parantezele rotunde ( ) se utilizează în expresii, pentru schimbarea ordinii de efectuare a operaţiilor, sau la apelul funcţiilor. La apelul funcţiilor, parantezele rotunde încadrează lista parametrilor efectivi. Din acest motiv, parantezele rotunde sunt numite şi operatori de apel de funcţie.
Exemplu:
double sum(double a, double b);
/*declar. funcţiei sum, care primeşte 2 argumente reale(double) şi returnează o valoare tip double */
void main()
{
. . .
double a=sum(89.9, 56.6); //apelul funcţiei sum, cu parametri efectivi 89.9 şi 56.6
int s0=6; double s1=(s0+9)/a; //folosirea parantezelor în expresii
. . .
}
-) Operatorii de indexare
Operatorii de indexare sunt parantezele pătrate []. Acestea includ expresii întregi care reprezintă indici ai unui tablou.
-) Operatori de acces la membri structurilor
Operatorii ::, ., ->, .* şi ->* permit accesul la componentele unei structuri.
În tabel sunt prezentaţi toţi operatorii, grupaţi pe categorii, cu priorităţile lor şi regulile de asociativitate. Operatorii dintr-o categorie au aceeaşi prioritate.
Nr. |
Clasă de operatori |
Operatori |
Asociativitate |
1. |
Primari |
() [] . -> :: |
de la stânga la dreapta |
2. |
Unari |
! ~ ++ — sizeof (tip) –(unar) *(deferenţiere) &(referenţiere) |
de la stânga la dreapta |
3. |
Multiplicativi |
* / % |
de la stânga la dreapta |
4. |
Aditivi |
+ – |
de la stânga la dreapta |
5. |
Deplasare pe bit |
<< >> |
de la stânga la dreapta |
6. |
Relaţionali |
< <= > >= |
de la stânga la dreapta |
7. |
De egalitate |
== != |
de la stânga la dreapta |
8. |
|
& (ŞI logic pe bit) |
de la stânga la dreapta |
9. |
|
^ (XOR pe bit) |
de la stânga la dreapta |
10. |
|
| (SAU logic pe bit) |
de la stânga la dreapta |
11. |
|
&& |
de la stânga la dreapta |
12. |
|
|| |
de la stânga la dreapta |
13. |
Condiţional |
?: |
de la dreapta la stânga |
14. |
De atribuire |
= += -= *= %= &= ^= |= <<= >>= |
de la dreapta la stânga |
15. |
Virgulă |
, |
de la stânga la dreapta |
EXPRESII
Prin combinarea operanzilor şi a operatorilor se obţin expresii. Tipul unei expresii este dat de tipul rezultatului obţinut în urma evaluării acesteia. La evaluarea unei expresii se aplică regulile de prioritate şi asociativitate a operatorilor din expresie. Ordinea de aplicare a operatorilor poate fi schimbată prin folosirea parantezelor. La alcătuirea expresiilor, este indicată evitarea expresiilor în care un operand apare de mai multe ori.
CONVERSII DE TIP
La evaluarea expresiilor, se realizează conversii ale tipului operanzilor. Conversiile sunt:
– Automate;
– Cerute de evaluarea expresiilor;
– Cerute de programator (prin construcţiile cast), explicite.
Conversiile automate sunt realizate de către compilator:
char, short int -> int
Ele sunt realizate de fiecare dată când într-o expresie apar operanzi de tipul char sau short int.
Conversiile cerute de evaluarea expresiilor sunt efectuate în cazurile în care în expresii apar operanzi de tipuri diferite. Înaintea aplicării operatorilor, se realizează conversia unuia sau a ambilor operanzi:
– Dacă un operand este de tip long int, celălalt este convertit la acelaşi tip; tipul expresiei este long int.
– Dacă un operand este de tipul double, celălalt este convertit la acelaşi tip; tipul expresiei este double.
– Dacă un operand este de tipul float, celălalt este convertit la acelaşi tip; tipul expresiei este float.
Conversiile explicite (cerute de programator) se realizează cu ajutorul construcţiilor cast.
Exemplu:
int x=3; float y; y=(float)x/2;
Înainte de a se efectua împărţirea celor 2 operanzi, operandul x (întreg) este convertit în număr real simplă precizie. După atribuire, valoarea lui y va fi 1.5. Dacă nu ar fi fost folosit operatorul de conversie în expresia y=x / 2, operanzii x şi 2 fiind întregi, rezultatul împărţirii este întreg, deci y ar fi avut valoarea 1.