Sunteți pe pagina 1din 7

Tutoriale C++ - Operatori

Am nvat cum s declarm variabile, cum s definim constante, cum s scriem corect n C++... acum e timpul s vedem
cum putem opera cu variabilele.
Nu trebuie s memorai toate nebuniile din acest tutorial (i nici din alte tutoriale)!

Atribuirea / Asignarea (=)


Deja ai fcut cunotin cu aceast operaie. Atribuie o valoare unei variabile. Operatorul de atribuire (asignare) este =.
1a = 5;
Ce reprezint a? Pi cum am mai zis, este o variabil ce reprezint o anumit poriune de memorie. Atunci cnd atribui 5
lui a (i dai lui a valoarea 5), 5 va fi stocat n respectiva poriune de memorie asociat cu identificatorul a.

Atribuirea se face ntotdeauna de la dreapta la stnga!


Adic 5 intr n a, i NU a l ia (absoarbe :D) pe 5.
Semantica operatorului de asignare = este pstreaz, stocheaz.
De asemenea poi atribui i valoarea unei alte variabile (nu trebuie s fie o constant ca mai sus, adic 5).
1a = b;
Valoarea lui b intr n a! Bineneles c vechea valoare a lui a (dac are una) este tears; b nu-i pierde valoarea.
Atenie doar valoarea lui b (o copie) este transferat. Memoria pe care b o reprezint rmne aceeai, la fel i a.
Adic a are valoarea lui b, dar reprezint n continuare acelai teren de memorie.
Mai multe despre toate acestea n tutorialele despre pointeri.
Expresia din dreapta operatorului (n acest caz b sau 5) se numete rvalue (right value), iar cea din stnga lvalue (left
value).
1 #include <iostream>
2 using namespace std;
3
4 int main ()
5 {
int a, b;
//
6
a
=
10;
//
7
b = 4;
//
8
a = b;
//
9
//
10 b = 7;
11
12 cout << "a:";
13 cout << a; // 4
14 cout << " b:";
15 cout << b; // 7
16
17 return 0;
18}

a:?,
a:10,
a:10,
a:4,
a:4,

b:?
b:?
b:4
b:4
b:7

Urmtoarea expresie este de asemenea valid:


1a = b = c = 5;

Operatorii Aritmetici
C++ dispune de urmtoarele operaii aritmetice:

+ adunare
- scdere
* nmulire
/ mprire
% modulo

11

Modulo (sau Mod) este operaia care calculeaz restul mpririi unui numr la alt numr.
Exemplu: 11 % 3 va fi 2.
Operatorii unari folosesc un singur operand. Cei binari folosesc doi operanzi (mai sus avei operatori binari).
Cnd vrei s efectuai o operaie asupra valorii curente a unei variabile putei folosi operatorii de atribuire compus.
1a
2a
3
4b
5b

= a + 2; // incrementeaza valoarea lui a cu 2


+= 2; // echivalenta cu expresia de mai sus
= b + (5 - 2); // echivalent cu
+= 5 - 2;

Iat lista cu aceti operatori (dei cred c este destul de evident):

+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=


Expresie

Echivalent cu

valoare += increment; valoare = valoare + increment;


a -= 5;

a = a - 5;

a /= b;

a = a / b;

x *= y + 1;

x = x * (y + 1);

Acum s vorbim despre operatorii incrementeaz (++) i decrementeaz (--).


Operatorul ++ incrementeaz valoarea unei variabile cu 1, iar -- o decrementeaz cu 1.
1// toate sunt echivalente
2c++;
3c+=1;
4c=c+1;
O proprietate a acestui operator este c poate fi folosit att ca prefix (++c) ct i sufix (c++). Diferena ntre cele dou?
Atunci cnd este prefix, valoarea variabilei este incrementat ntainte ca ntreaga expresie s fie evaluat. Exemplu:
1int a = 2;
2cout << ++a; // se afiseaza 3
3
4// un echivalent ar fi
5int a = 2;
6a += 1;
7cout << a;
Aici a este incrementat nainte ca expresia s fie evaluat (m refer la cout << ++a;).
Atunci cnd este sufix, valoarea variabilei este incrementat dup ce ntreaga expresie este evaluat. Exemplu:
1int a = 2;
2cout << a++; // se afiseaza 2
3
4// echivalent
5int a = 2;
6cout << a;
7a += 1;
n acest caz, a este incrementat dup ce expresia cout << a++; este evaluat (testat).

12

Afiarea
n C++ tiprirea rezultatelor se face folosind o variabil special numit cout mpreun cu operatorul de inserie (<<).
1cout << "Hello World!";
Instruciunea de sus afieaz caracterele Hello World! la dispozitivul standard de ieire, de obicei ecranul.
Variabila cout este predefinit n C++ i semnific un flux de ieire. Acesta poate fi imaginat ca o secven nesfrit de
caractere care merg ctre dispozitivul de ieire (aici fiind ecranul).
Operatorul de inserie << (put to) folosete 2 operanzi. Cel din stnga este o expresie flux (stream) (de exemplu cout).
n dreapta se afl irul sau expresia al crei rezultat trebuie afiat.
De remarcat faptul c operatorul << arat sensul n care circul datele: dinspre expresie sau string nspre streamul de
ieire. Operatorul << poate fi folosit de mai multe ori ntr-o singur instruciune de afiare:
1cout << "Hello!" << "Wassup" << a * b; // a, b - doua variabile oarecare
Pentru a tiprii linii separate scriem:
1cout << "Hello" << endl;
2cout << "World";
3// sau mai simplu
4cout << "Hello" << endl << "World";
Identificatorul endl (end line) este un element special din C++ care permite terminarea unei linii i continuarea scrierii pe
linia urmtoare.
Sau putei folosi secvena escape '\n':
1cout << "Hello\nWorld";

Stream-uri de intrare i operatorul de extracie >> (Citirea)


n C++, conceptul de stream este esenial. Putem gndi un stream de ieire ca pe o secven infinit de date care circul
dinspre program nspre un dispozitiv de ieire. Un stream de intrare este o secven infinit de caractere care pornete de
la un dispozitiv de intrare i este dirijat ctre program.
Fiierul header iostream conine, printre altele, definiiile a dou tipuri de date: istream i ostream. Aceste tipuri de date
reprezint stream-uri de intrare i stream-uri de ieire. Acest fiier header mai conine dou declaraii care arat
aproximativ astfel:
1istream cin;
2ostream cout;
Cele dou declaraii arat c cin este un obiect de tip istream i cout este un obiect de tip ostream.
n mod explicit, cin este asociat cu tastatura, iar cout cu display-ul (ecranul). Putem citi date din cin folosind operatorul
de extracie >>:
1cin >> a; // 'a' - variabila oarecare
Operatorul de extracie >> are doi operanzi. n stnga se gsete un stream, n cel mai simplu caz cin, iar n dreapta se
gsete o variabil avnd un tip predefinit (char, int, float etc.).
La fel ca i cout, cin poate fi folosit de mai multe ori ntr-o instruciune.
Trebuie s fim ateni atunci cnd folosim cei doi operatori, pentru c cin poate fi folosit doar n combinaie cu >>, iar cout
doar cu <<.
Atunci cnd extrage valori dintr-un stream, operatorul >> ignor orice spaiu de la nceput. De asemenea, ignor
caracterul care marcheaz sfritul liniei. Apoi, operatorul >> procedeaz la extragerea valorilor din stream-ul de intrare.
Dac data ateptat este un char, intrarea se ntrerupe dup primul caracter. Dac este vorba de un int sau
double, intrarea se ntrerupe la primul caracter care nu se potrivete ca tip de dat, cum ar fi un spaiu.

13

Operatorii relaionali i de egalitate


Cu aceti operatori putei realiza operaii boolean i de egalitate. S vedem cum:

=
Egal cu
=
!= Diferit de
> Mai mare ca
<

Mai mic ca

>
Mai mare sau egal cu
=
<
Mai mic sau egal cu
=
Exemple:
1(7
2(5
3(3
4(6
5(5

== 5)
> 4)
!= 2)
>= 6)
< 5)

//
//
//
//
//

se
se
se
se
se

evalueaza
evalueaza
evalueaza
evalueaza
evalueaza

la
la
la
la
la

FALSE
TRUE
TRUE
TRUE
FALSE

De asemenea putei folosi i variabile. Presupunem a = 2, b = 3 i c = 6:


1(a == 5)
2(a*b >= c)
3(b+4 > a*c)
4((b=2) == a)

//
//
//
//

se
se
se
se

evalueaza
evalueaza
evalueaza
evalueaza

la
la
la
la

FALSE
TRUE
FALSE
TRUE

Nu confundai operatorul de atribuire = cu operatorul de egalitate == !


Linia 4, de la ultimul exemplu, este TRUE deoarece mai nti b ia valoarea 2, iar apoi se evalueaz rezultatul expresiei.
Se pot folosi operatori relaionali nu doar pentru a compara valori ale variabilelor sau constantelor, ci i pentru a compara
valori ale expresiilor aritmetice.
1int x = 15, y = 6;
2// urmatoarea expresie este adevarata; TRUE
3x + 15 == 5 * y;

Operatorii logici
Operatorul NOT (!) se insereaz n faa expresiei. Acesta inverseaz rezultatul boolean al expresiei. Adic? Exemplu...
!(5 == 5)
1inverseaza
2!(6 <= 4)
3!true
//
4
!false
//

// se evalueaza la FALSE deoarece expresia (5 == 5) este TRUE. Cum am zis,


// se evalueaza la TRUE deoarece (6 <= 4) este FALSE
se evalueaza la FALSE
se evalueaza la TRUE

NOT ne d o metod de a inversa sensul unei presupuneri. Exemplu:


1! (oreDeStudiu > 40)
2// echivalent cu
3oreDeStudiu <= 40

14

Conform regulilor lui De Morgan avem:


1 ! (a == b)
2 // echivalent cu
3 a != b
4
5 ! (a == b || a == c)
6 // echivalent cu
7 a != b && a != c
8
9 ! (a == c && c > d)
10// echivalent cu
11 a != c || c <= d
Mai sunt i operatorii AND (&&) i OR (||) care s vedem ce fac.
&& returneaz TRUE dac ambele expresii (sau operanzi) sunt TRUE. Returneaz FALSE dac una din ele este FALSE.
|| returneaza TRUE dac cel puin una din expresii este TRUE. Returneaz FALSE dac ambele expresii sunt FALSE.
Iat nite tabele cu valorile pe care le pot returna aceti operatori (tabelele de adevr):
AND - I (&&)

a &&
b

true

true

true

false false

false true

true
false

false false false

OR - SAU (||)

true

true

true

false true

false true

a || b
true
true

false false false


C++ evalueaz de la stnga la dreapta atunci cnd folosim operatorii logici. Asta nseamn c n funcie de valoarea
expresiei din stnga, C++ ignor sau NU expresiile din dreapta. Ce vreau s spun?

&& - dac expresia din stnga este false, atunci rezultatul va fi false (partea din dreapta nu este
evaluat)
|| - dac expresia din stnga este true, atunci rezultatul va fi true (partea din dreapta nu este
evaluat)
Aceast scurttur este cunoscut ca short-circuit evaluation.
1( (5 == 5) && (3 > 6) )
2( (5 == 5) || (3 > 6) )

// se evalueaza la FALSE ( true && false ).


// se evalueaza la TRUE ( true || false ).

Vei folosi aceti operatori cel mai mult n structurile condiionale.

15

Operatorul condiional (?)


Evalueaz o expresie i returneaz o anumit valoare dac expresia este TRUE i alta dac este FALSE.
1conditie ? rezultat1 : rezultat2
Dac expresia condiie este TRUE atunci se returneaz rezultat1, altfel se returneaz rezultat2.
17==5 ? 4 : 3
27==5+2 ? 4 : 3
35>3 ? a : b
4a>b ? a : b

//
//
//
//

returneaza
returneaza
returneaza
returneaza

3, din moment ce 7 NU este egal cu 5


4 (7 este egal cu 5+2)
valoarea lui a (5 este mai mare ca 3)
maximul dintre cele doua.

Operatorul de conversie explicit de tip (type casting)


Convertete o variabil dintr-un tip n altul.
1int i;
2float f = 3.14;
3i = (int) f; // i contine 3
Se mai putea i aa:
1i = int ( f );
Cnd un numr real este asignat unei variabile ntregi, partea fracionar este trunchiat (eliminat):
1int a; float b = 4.56;
2a = b; // a == 4
Aceast transformare automat a unei valori dintr-un tip de dat n alt tip de dat se numete conversie implicit (type
coercion, forare de tip).
Pstrarea rezultatului unei expresii cu rezultat de tip ntreg ntr-o variabil real (float) nu provoac pierderi de informaie.
Stocarea rezultatului unei expresii reale ntr-o variabil ntreag conduce la trunchierea prii fracionare.
1int a = 12; float b;
2b = a; // b == 12.0
Compilatorul insereaz, n acest caz, dou noi instruciuni care mai nti convertesc valoarea 12 n 12.0 i apoi stocheaz
12.0 n variabila b.
sizeof() accept un parametru ce poate fi o variabil sau un tip de dat. Returneaz mrimea n bytes a obiectului
(variabilei) sau tipului de dat.
1a = sizeof (char); // a va fi 1

Prioritatea operatorilor
Se respect prioritatea nmulirii i a mpririi (parantezele au prioritate superioar), dar mai bine studiai acest tabel de
prioriti (de la cea mai mare la cea mai mic prioritate). Prin prioritate (preceden) m refer la ordinea n care este
evaluat fiecare operator, adic cine este evaluat primul i cine ultimul (ntr-o expresie).

Nivel

Operator

Descriere
scope

Grupare
Stnga-ladreapta

::

() [] . -> ++ -- dynamic_cast static_cast reinterpret_cast


sufix
const_cast typeid

++ -- ~ ! sizeof new delete


*&
+-

unar (prefix)
indirectare i referin
(pointeri)
unar de semn

Dreapta-lastnga

(type)

conversie explicit

Dreapta-lastnga

Stnga-ladreapta

16

.* ->*

pinter-ctre-membru

Stnga-ladreapta

*/%

multiplicativi

Stnga-ladreapta

+-

adiionali

Stnga-ladreapta

<< >>

deplasare

Stnga-ladreapta

< > <= >=

relaional

Stnga-ladreapta

10

== !=

de egalitate

Stnga-ladreapta

11

&

bitwise AND

Stnga-ladreapta

12

bitwise XOR

Stnga-ladreapta

13

bitwise OR

Stnga-ladreapta

14

&&

logical AND

Stnga-ladreapta

15

||

logical OR

Stnga-ladreapta

16

?:

condiional

Dreapta-lastnga

17

= *= /= %= += -= >>= <<= &= ^= |=

atribuire (asignare)

Dreapta-lastnga

18

virgul

Stnga-ladreapta

Expresiile aritmetice sunt formate din constante, variabile, operatori i paranteze. Ordinea n care sunt realizate operaiile
este stabilit conform regulilor de preceden.
Regulile de preceden se aplic i operatorilor logici i relaionali.
n coloana Grupare este definit ordinea de grupare (Asociativitatea) atunci cnd n aceeai expresie apar mai muli
operatori cu aceeai preceden.
Cnd nu suntei siguri de ordinea operaiilor, cel mai bine este s folosii parantezele (). Observai c au un nivel mare de
prioritate (nivelul 2).
Folosind parantezele, se poate schimba ordinea de evaluare a expresiei.

Expresii i Conversii
Prin combinarea operanzilor i a operatorilor se obin expresii. Tipul unei expresii este dat de tipul rezultatului obinut n
urma evalurii 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.
Conversiile automate sunt realizate de ctre compilator. Ele sunt realizate de fiecare dat cnd ntr-o expresie apar
operanzi de tipul char sau int.
Conversiile cerute de evaluarea expresiilor sunt efectuate n cazurile n care n expresii apar operanzi de tipuri diferite.
naintea aplicrii operatorilor, se realizeaz conversia unuia sau a ambilor operanzi.
Conversiile explicite (cerute de programator) se realizeaz cu ajutorul construciilor cast (vezi mai sus).
Dac este ceva neclar, lsai un mesaj!

17

S-ar putea să vă placă și