Expresii si operatori


    O expresie este o succesiune de operatori si operanzi legati intre ei, dupa reguli specifice limbajului, in scopul efectuarii unor operatii (calcule, atribuiri, apelari de functii etc.)
    Operanzii pot fi: constante, variabile, functii.
    Prioritatea (precedenta) operatorilor ne indica ordinea in care se efectueaza operatiile. In C++exista 16 niveluri de prioritate.
 
 
PRIORITATE OPERATORI TIP OPERATOR OBSERVATII
1
( )   [ ] 
->
::
.
apel, indexare, indirectare, 
acces C++, selector
 
2

+  - 
++  -- 
*
&
(typecast) 
sizeof 
new  delete
operatori unari
-not (!) Ex: !0=1, !1=0
-Ex: -10, +23, i++, ++i, i--, --i
-* - operator de dereferentiere (*a  reprez. continutul variabilei memorate in a, unde a este un pointer)
-& - operator adresa sau de referentiere 
(&a determina adresa de inceput a zonei de memorie alocata variabilei a)
-(typecast)-operator de conversie explicita Ex: (float)5/2 este 2.5
-sizeof-pentru determinarea dimensiunii in octeti a unei date sau a unui tip 
Ex: int x; sizeof(int)=2;sizeof(x)=2
-new, delete-operatori pentru var. dinamice
3
.*  ->*
referinte C++
 
4
*  /  %
operatori multiplicativi
- operatorul % actioneaza numai asupra operanzilor intregi
- operatorul / face impartirea intreaga daca cei doi operanzi ai sai sunt intregi si reala, daca macar un operand este real
5
+  -
operatori aditivi
operatori binari pentru adunare si scadere
6
<<  >>
operatori de deplasare
 operatori unari de deplasare la stanga/ dreapta a bitilor unui operand
7
<  <=  >  >=
operatori relationali
 rezultatul unei operatii logice poate fi 1 (TRUE) sau 0 (FALSE)
8
= =   !=
operatori de egalitate
_______ ,, _______
9
&
SI binar
operator pe biti
10
^
XOR binar
 _______ ,, _______
11
|
OR binar
 _______ ,, _______
12
&&
SI logic
 0&&1=0, 1&&1=1, 0&&0=0 
13
||
SAU logic
 0||1=1, 0||0=0, 1||1=1
14
?:
operatorul conditional
 e1?e2:e3 (daca e1!=0, valoarea expresiei este e2, altfel este e3)
15

*=  /=  %=  -= 
^=  |=  <<=  >>=
operatori de atribuire
= - atribuire simpla
- v op expresie <=> v=v op expresie
- atribuiri la nivel de bit
16
,
operatorul virgula
leaga mai multe expresii
Ex: exp1, exp2, exp3, exp4 - valoarea expresiei este egala cu valoarea ultimei expresii (exp4)

Operatorii pot fi:
 unari (necesita un singur operand);
 binari (necesita doi operanzi);
 ternari (trei operanzi).

O expresie este o combinatie corecta din punct de vedere sintactic, formata din operanzi si operatori. Expresiile, ca si operanzii, au tip si valoare.

Operatorul de atribuire
Sau de asignare, este un operator binar care se aplica tuturor tipurilor de variabile. Este folosit sub formele urmatoare:

nume_variabila=expresie;
    sau:
expresie1=expresie2;

Se evalueaza expresia din membrul drept, iar valoarea acesteia este atribuita variabilei din membrul stang. Daca tipurile membrilor stang si drept difera, 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.

Asa cum se observa in linia a 2-a din exemplul precedent, operatorul de atribuire poate fi utilizat de mai multe ori in aceeasi expresie. Asociativitatea operatorului are loc de la dreapta la stanga. Astfel, mai intai b=10, apoi a=b.

Exercitiu:  Sa se scrie urmatorul program si sa se urmareasca rezultatele executiei acestuia.
#include <iostream.h>
int main()
{
float x,y=4.25; char car=’A’; int a,b,c;
cout<<”Val. lui y este:”<<y<<’\n’;   //Afisare: Val. lui y este:4.25
x=y; cout<<”Val. lui x este:”<<x<<’\n’; //Afisare: Val. lui x este:4.25
a=x;cout<<”Val.lui a este:”<<a<<’\n’; //Afisare:Val. lui a este:4, deoarece a de tip int!!!
c=b=a; cout<<”b=”<<b<<”\tc=”<<c<<’\n’;  //Afisare: b=4    c=4
cout<<”Introduceti val. lui c:”; cin>>c;  // citire val. pentru c
cout<<”Val. lui c este:”<<c<<’\n’;   //Afisare: Val. lui c este:4
     return 0;
}

Operatorul poate fi aplicat tipurilor de date intregi, reale, caracter, si chiar siruri de caractere, asa cum vom vedea in capitolele urmatoare (exemplu: char sir [10]=”a5dfgthklj”).

Operatori aritmetici:

- minus (unar  un singur operand)
+ plus (unar)

+ plus (binar pentru adunare)
- (binar pentru scadere)
* (binar pentru inmultire)
/ (binar pentru impartire)
%( binar pentru restul impartirii intregi)

Observatii:

/  actioneaza diferit in functie de operanzi:
    - daca ambii sunt intregi rezultatul este intreg si are semnificatia de impartire intreaga
    Ex:
   int a=7, b=2;
   float c=2;
   cout<<a/b;  // afiseaza 3
 Rezultatul este real daca cel putin unul din operanzi este real

   cout<<a/c;  //afiseaza 3.5

% actioneaza corect numai daca cei doi operanzi sunt numere naturale si furnizeaza rezul impartirii intregi.
 Ex:
     int a=7, b=2;
     cout<<a%b; //afiseaza 1
 

Operatori aritmetici binari compusi
Operator  Semnificatie  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
Acesti operatori se obtin prin combinarea operatorilor aritmetici binari cu operatorul de atribuire si sunt folositi sub forma urmatoare:

 expresie1  operator= expresie2;

Rezultatul obtinut este acelasi cu rezultatul obtinut prin:
 expresie1 = expresie1  operator  expresie2;
Toti acesti operatorii modifica valoarea operandului stang prin adunarea, scaderea, inmultirea sau impartirea  acestuia prin valoarea operandului drept.
Constructia x+=1 genereaza acelasi rezultat ca expresia x=x+1.
Observatiile referitoare la operatorii aritmetici binari sunt valabile si pentru operatorii aritmetici binari compusi. Operatorii aritmetici binari compusi au aceeasi prioritate si asociativitate ca si operatorul de atribuire.

Exercitiu:  Sa se scrie urmatorul program si sa se urmareasca rezultatele executiei acestuia.
#include <iostream.h>
int main()
{
int a,b; float c=9.3; a=3; b=8;
cout<<”a=”<<a<<’\n’;   //Afisare  a=3
a+=b; cout<<”a=”<<a<<’\n’;  //Afisare  a=11
a-=b; cout<<”a=”<<a<<’\n’;  //Afisare  a=-5
a*=b; cout<<”a=”<<a<<’\n’;  //Afisare  a=24
a/=b; cout<<”a=”<<a<<’\n’;  //Afisare  a=0
a%=b; cout<<”a=”<<a<<’\n’;  //Afisare  a=3
     return 0;
}
 

Operatori de incrementare si decrementare

Acestia sunt operatori unari si au rolul de a incrementa (aduna 1) sau decrementa (scad 1) continutul unei variabile.  Aestia sunt:
    ++ pentru incrementare
    -- pentru decrementare
Operatorii pot fi prefixati (inaintea operandului) sau postfixati (dupa operand)

 Operatorii de incrementare si decrementare pot fi aplicati  datelor numerice sau caracter.

Ambii operatori pot fi folositi în forma prefixata, înaintea operandului, (++a, respectiv --a) sau postfixata, dupa operand (a++, respectiv a--).Utilizarea acestor operatori în expresii, în forma prefixata sau postfixata, determina 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;

 Operatorul unar adresa &
Poate fi aplicat identificatorului unei variabile, furnizeaza adresa la care este memorata aceasta. Poate fi aplicat oricarui tip de date si se mai numeste operator de referentiere.

Exemplu:
int a;
cout<<"Adresa la care este memorata variabila a este:"<<&a;

Operatori relationali binari

Operator  Semnificatie   Exemple
= =   Egal cu    a= =b
!=     Diferit de   a!=b
<   Mai mic decat   a<b
<=   Mai mic sau egal  a<=b
>   Mai mare decat   a>b
>=   Mai mare sau egal  a>=b

Primii doi operatori mai sunt numiti operatori de egalitate. Operatorii relationali servesc la compararea valorilor celor doi operanzi si nu modifica valorile operanzilor. Rezultatul unei expresii in care apare unul din operatorii relationali binari este intreg si are valoarea zero (0) daca relatia este falsa, sau valoarea unu (1) (sau diferita de 0 in cazul compilatoarelor sub UNIX), daca relatia este adevarata. Acesti operatorii pot fi aplicati datelor de tip intreg, real sau char.

Observatie: Deosebirea dintre operatorii = = (relational, de egalitate) si = (de atribuire) consta in faptul ca primul nu modifica valoarea nici unuia dintre operanzii sai, pe cand cel de-al doilea modifica valoarea operandului stang (vezi exemplul urmator)

Exercitiu:  Sa se scrie urmatorul program si sa se urmareasca rezultatele executiei acestuia.
#include <iostream.h>
int main()
{
int a=1, b=20, lim=100; int rezult; rezult=a<b;
cout<<”a<b=”<<rezult<<endl;
// Afisare:  a<b=1 (sau o alta valoare diferita de zero pentru alte compilatoare)
rezult=a<=b;
//operatorul realtional <= are prioritate mai mare decat cel de atribuire
cout<<”a<=b=”<<rezult<<endl;
// Afisare:  a<b=1 (sau o alta valoare diferita de zero pentru alte compilatoare)
rezult=a>b; cout<<”a>b=”<<rezult<<’\n’;  // Afisare:  a<b=0
     return 0;
}

 Operatori logici
Operator      Semnificatie                             Exemple
!                   Not (negatie logica)                !(a= =b)
&&               And (conjunctie, si logic)       (a>b) && (b>c)
||                   Or (disjunctie, sau logic)          (a>b) || (b>c)

Acesti operatori pot fi aplicati datelor de tip intreg, real sau caracter.
Expresia   !expresie are valoarea 0 (fals) daca expresia-operand are o valoare diferita de zero si valoarea unu (adevarat) daca expresia-operand are valoarea zero.
Expresia   expresie1||expresie2 are valoarea diferita de 0 (true) daca FIE expresie1, FIE expresie2 au valori diferite de zero.
Expresia   expresie1 && expresie2 are valoarea diferita de 0 (true) daca AMBELE expresii-operand ( expresie1 si expresie2) au valori diferite de zero.

Operatorul conditional
Este un operator ternar (necesita 3 operanzi), utilizat in constructii de forma:
expresie1?expresie2:expresie3

Se evalueaza expresia1. Daca aceasta are o valoare diferita de zero, atunci tipul si valoarea intregii expresii vor fi aceleasi cu tipul si valoarea expresiei2. Altfel (daca expresie1 are valoarea zero), tipul si valoarea intregii expresii vor fi aceleasi cu tipul si valoarea expresiei3. Deci operatorul conditional este folosit pentru a atribui intregii expresii tipul si valoarea expresiei2 sau a expresiei3, in functie de o anumita conditie. Acest lucru este echivalent cu:
Daca expresie1 diferita de zero
Atunci evalueaza expresie2
Altfel evalueaza expresie3
Exemplu:
 int semn=(x<0)?-1:1
Daca x<0, atunci semn=-1, altfel semn=1.

Operatorul virgula
Este utilizat in constructii de forma:
expresie1 , expresie2
Operatorul virgula forteaza evaluarea unei expresii de la stanga la dreapta. Tipul si valoarea intregii expresii este data de tipul si valoarea expresiei2. Operatorul virgula este folosit in instructiunea for. Operatorul virgula are cea mai mica prioritate.

Exemplu:
int x, c, y;
cout<<”Astept val. ptr. y:”; cin>>y;
x=(c=y, c<=5); /* c va primi valoarea lui y (citita); se verifica daca c este mai mic sau
egal cu 5. Daca nu, x=0; daca da, x=1 sau x=valoare diferita de zero)*/
x++, y--;  //intai este incrementat x, apoi este decrementat y

Operatorul sizeof()
Este un operator unar, care are ca rezultat numarul de octeti pe care este memorata o data de un anumit tip. Operandul este un tip sau o data (constanta sau variabila) de un anumit tip.
Exemple:
 cout<<sizeof(int); // afiseaza numarul de octeti pe care este memorat un intreg (2)
 cout<<sizeof(”ab6*”);// afiseaza 5, nr. de octeti pe care este memorata constanta sir ”ab6*”

Operatorul (tip)
Este un operator unar care apare in constructii numite ”cast” si converteste tipul operandului sau la tipul specificat intre paranteze.
Exemple:
 int a; (float) a; // converteste operandul a (care era de tip intreg) in float

Operatorii paranteza
Parantezele rotunde ( ) se utilizeaza in expresii, pentru schimbarea ordinii de efectuare a operatiilor, sau la apelul functiilor. La apelul functiilor, parantezele rotunde incadreaza lista parametrilor efectivi. Din acest motiv, parantezele rotunde sunt numite si operatori de apel de functie.

Operatorii de indexare
Operatorii de indexare sunt parantezele patrate []. Acestea includ expresii intregi care reprezinta indici ai unui tablou.

Operatori de acces la membri structurilor
Operatorii ::, ., ->, .* si ->* permit accesul la componentele unei structuri. Ei vor fi studiatimai tarziu.
 

In afara operatorilor prezentati, exista si altii, pe care ii vom enumera in continuare. Despre acesti operatori vom discuta in capitolele viitoare, cand cunostintele acumulate vor permite acest lucru.

EXPRESII
Prin combinarea operanzilor si a operatorilor se obtin expresii. Tipul unei expresii este dat de tipul rezultatului obtinut in urma evaluarii acesteia. La evaluarea unei expresii se aplica regulile de prioritate si asociativitate a operatorilor din expresie. Ordinea de aplicare a operatorilor poate fi schimbata prin folosirea parantezelor. La alcatuirea expresiilor, este indicata evitarea expresiilor in care un operand apare de mai multe ori.