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.