Académique Documents
Professionnel Documents
Culture Documents
Operatorii aritmetici
Operatori unari: operatorul minus (-),
operatorul plus (+)
- folosii pentru stabilirea semnului unui operand numeric.
Operatori binari:
- de adunare:
operatorul pentru adunare (+),
operatorul pentru scdere (-)
- de nmulire:
operatorul pentru nmulire (*),
operatorul pentru mprire (/),
operatorul modulo restul mpririi (%)
- asociativitate de la stnga la dreapta
- precedena operatorii unari au prioritate mai mare dect cei
binari, iar pentru cei binari preceden a este cea aritmetic
Operatorii aritmetici
Observaii:
1. Operatorul / se folosete i pentru mprirea
ntreag, dar i pentru mprirea real, rezultatul
depinznd de tipul operanzilor, astfel: dac ambii
operanzi sunt de tip ntreg, rezultatul va fi de tip ntreg
(mprire ntreag); dac cel puin unul dintre operanzi
este de tip real, rezultatul va fi de tip real (mprire
real)
Operatorii aritmetici
Exemplu:
#include<iostream.h>
void main()
{int a=10,c=3;
float b=10;
cout<<a/3;
//3
cout<<b/3;
//3.333333
cout<<a/c;
//3
cout<<a/3.;
//3.333333
}
Operatorii aritmetici
Observaii:
2. Operatorul % NU se poate aplica pe valori
numerice reale (pe operanzi de tip float sau
double)
3. Operatorii / i % se pot folosi pentru a calcula
ctul (c) i restul (r) mpririi a dou numere ntregi
a i b cu semn.
c = |a| / |b|
r = |a| % |b|
a
a/b
a%b
>0
>0
>0
<0
-c
<0
>0
-c
-r
<0
<0
-r
Operatorii aritmetici
Exemplu:
#include<iostream.h>
void main()
{int a=7,b=3;
cout<<a/b<< <<a%b<<endl;
cout<< a/-b<< <<a%-b<<endl;
cout<< -a/b<< <<-a%b<<endl;
cout<< -a/-b<< <<-a%-b<<endl;
}
//2 1
//-2 1
//-2 -1
//2 -1
Operatorii aritmetici
4. Pentru a schimba ordinea implicit de executare a
operatorilor matematici dat de prioritatea lor, se pot
folosi parantezele rotunde () care au rol de separatori.
Exemplu:
#include<iostream.h>
void main()
{int a=7,b=3;
cout<<a+b*2<< <<(a+b)*2<<endl;}
//13 20
Operatorii aritmetici
5. O expresie aritmetic poate conine operanzi numerici de mai multe
tipuri.
Dac a i b sunt operanzi numerici de dou tipuri diferite (char i
int, int i float), iar c este rezultatul, tipul rezultatului c se va obine prin
conversie aritmetic implicit se face promovarea tipului inferior la
tipul superior, rezultatul avnd tipul superior.
Regulile de conversie aritmetic implicit:
a) dac unul dintre operanzi este de tip long double, i cellalt este
convertit n tipul long double, altfel se trece la pasul b);
b) dac unul dintre operanzi este de tip double, i cellalt este convertit
n tipul double, altfel se trece la pasul c);
c) dac unul dintre operanzi este de tip float, i cellalt este convertit n
tipul float, altfel se trece la pasul d);
d) dac unul dintre operanzi este de tip unsigned long, i cellalt este
convertit n tipul unsigned long, altfel se trece la pasul e);
e) dac unul dintre operanzi este de tip long, i cellalt este convertit n
tipul long, altfel se trece la pasal f);
f) convertete tipurile char, unsigned char i short n tipul int.
Operatorii aritmetici
Exemplu:
#include<iostream.h>
void main()
{float a=1;
char b=a;
cout<<a+b<<endl;
//98
const float PI=3.14;
int raza = 2;
cout<<aria= <<PI*raza*raza<<endl;
}
Operatorii de incrementare i
decrementare
Sunt operatori unari care se aplic pe un operand numeric:
- operatorul de incrementare ++ adun 1 la valoarea
operandului (a++ aa+1)
- operatorul de decrementare -- scade 1 la valoarea
operandului (a-- aa-1)
Aceti operatori pot fi:
- prefixai se aplic naintea operandului (++a sau
--a) incrementarea, respectiv decrementarea operandului,
se face naninte ca valoarea operandului s intre n calcul
(nainte s fie evaluat expresia)
- postfixai - se aplic dup operand (a++ sau a--)
incrementarea, respectiv decrementarea operandului, se
face dup ce valoarea operandului a intrat n calcul (dup
ce a fost evaluat expresia)
Operatorii relaionali
Sunt operatori binari, iar rezultatul produs este de tip
numeric: 0 pentru fals i 1 pentru adevrat.
Ei se impart in doua grupe:
- operatori relaionali pentru inegaliti:
< >
<= >=
- operatori relaionali petru egalitate:
== (egal) != (diferit)
Operatorii relaionali de inegalitate au prioritate mai
mare dect cei de egalitate, iar toi operatorii
relaionali au prioritate mai mic dect operatorii
aritmetici.
Asociativitatea operatorilor relaionali este de la
stnga la dreapta.
Operatorii relaionali
Exemplu:
#include<iostream.h>
void main()
{int a=2,b=3;
cout<<(a>b)<< <<(a<=b)<<endl;
cout<<(a==b)<< <<(a!=b)<<endl;}
//0 1
//0 1
Operatorii logici
Exist trei operatori logici:
- operatorul unar pentru negaie logic: !
- operatorul binar pentru i logic: &&
- operatorul binar pentru sau logic: ||
Operatorii logici se aplic pe orice variabil sau constant
de tip numeric (0 = fals, orice valoare diferit de zero =
adevrat) i produc un rezultat numeric: 0 pentru fals i 1
pentru adevrat.
Operatorul && are prioritate mai mare dect operatorul ||,
iar operatorul de negare !, fiind operator unar, are prioritate
mai mare dect operatorii && i ||.
Asociativitatea operatorilor logici binari cu acelai nivel de
prioritate este de la stnga la dreapta.
. Operatorii logici au prioritate mai mic dect operatorii
relaionali.
Operatorii logici
Exemplu:
#include<iostream.h>
void main()
{float x=2.5;
int a=0,b=2,c=3;
cout<<(x>0)<< <<(!x)<< <<(b&&c)<<endl; //1 0 1
cout<<(a&&c)<<(a||c)<<(x&&c)<<endl;
//011
cout<<(a&&x)<<(a||x)<<endl;}
//01
Operatorii logici
Observaii:
- n cazul operatorilor logici binari, al doilea operand
nu mai este evaluat dac primul operand decide valoarea
rezultatului:
- operatorul &&: dac primul operand are valoarea
0, rezultatul este 0 oricare ar fi valoarea celui de-al doilea
operand, iar dac valoarea primului operand este 1, rezultatul
depinde de valoarea celui de-al doilea operand (nu se mai
evalueaz al doilea operand doar atunci cnd primul are
valoarea 0);
- operatorul ||: dac primul operand are valoarea 1,
rezultatul este 1 oricare ar fi valoarea celui de-al doilea
operand, iar dac valoarea primului operand este 0, rezultatul
depinde de valoarea celui de-al doilea operand (nu se mai
evalueaz al doilea operand doar atunci cnd primul are
valoarea 1).
Operatorii logici
Exemplu:
#include<iostream.h>
void main()
{int a=0,b=1;
cout<<(a&&b++)<<endl;
cout<<b<<endl;
cout<<(b||a++)<<endl;
cout<<a<<endl;}
//0
//1
//1
//0
Operatorii de atribuire
Operatorul de atribuire = este un operator binar (a=b) care
atribuie primului operand (a) valoarea celui de-al doilea
operand (b).
Construcia a=b este o expresie, rezultatul evalurii ei fiind
valoarea primului operand (a).
Operatorul de atribuire are prioritatea mai mic dect toi
operatorii prezentai.
i n cazul operatorului de atribuire acioneaz conversia
implicit de tip, tipul expresiei a=b este dat de tipul primului
operand (a).
Exist trei moduri n care poate fi folosit operatorul de atribuire:
- atribuirea simpl
- atribuirea multipl
- atribuirea cu operator
Atribuirea simpl.
Primul operand este un nume de variabil de memorie,
iar al doilea operand este o expresie.
nume_variabil=expresie;
Mod de execuie:
- se evalueaz expresia
- valoarea obinut se atribuie variabilei de memorie,
fcndu-se, dac este cazul, conversia de tip.
Instruciunea prin care unei variabile i se atribuie valoarea
unei expresii se numete instruciune de atribuire.
Atribuirea simpl.
Exemplu:
#include<iostream.h>
void main()
{unsigned x=5,y=2;
float a,b,c,d;
cout<<(a=5*x/y)<<endl; //12
b=5*(x/y); c=5.*x/y; d=5.*(x/y);
cout<<a<< <<b<< <<c<< <<d<<endl;
//12 10 12.5 10
a=5*(float)x/y; b=5*((float)x/y);
cout<<a<< <<b<<endl;} //12.5 12.5
Atribuirea simpl.
Tipul expresiei a=b este dat de tipul primului operand (a). Dac
tipul primului operand este inferior tipului celui de al doilea
operand, pot s apar pierderi de date (conversia implicit
de tip).
Exemplu:
#include<iostream.h>
void main()
{unsigned a=2000;
char c=a;
a=c; cout<<a<<endl;
//97
a=20; c=a; cout<<(unsigned)c<<endl; //20
a=2000; c=a; a=c;
cout<<(unsigned int)c<< <<a<<endl;} //65488 65488
Atribuirea simpl.
Dac unei variabile de tip ntreg i se atribuie
valoarea unei variabile reale, valoarea acesteia este
trunchiat.
Exemplu:
#include<iostream.h>
void main()
{int a;
float b=1.8, c=-2.7;
a=b; cout<<a<<endl;
a=c; cout<<a<<endl;}
//1
//-2
Atribuirea simpl.
Ce afieaz urmtoarele programe:
Program1:
#include<iostream.h>
void main()
{float x;
cout<<x=;cin>>x; //se citete 0.123
x=x*10; x=(x-(int)x)*10; x=(int)x/10.;
cout<<x<<endl;}
Program2:
#include<iostream.h>
void main()
{int a,b,x;
cout<<a=;cin>>a; cout<<b=; cin>>b;
x=a; a=b; b=x;
cout<<a<< <<b<<endl;}
Atribuirea multipl.
Deoarece operaia de atribuire simpl este o expresie,
rezultatul ei poate fi atribuit unei alte variabile de
memorie, rezultnd o nou expresie, al crei rezultat
poate fi atribuit unei alte variabile de memorie .a.m.d.,
rezultnd o atribuire multipl, prin care aceeai
valoare furnizat de o expresie se atribuie mai multor
variabile de memorie identificate prin nume1, nume2, ...
numen.
Atribuirea multipl.
nume1=nume2=...=numen-1=numen=expresie;
Mod de execuie:
- se evalueaz expresia;
- valoarea obinut se atribuie variabilei de memorie numen,
fcndu-se, dac este cazul, conversia de tip;
- coninutul variabiblei numen se atribuie variabilei de
memorie identificate cu numen-1, fcndu-se, dac este
cazul, conversia de tip;
- .a.m.d. Pn cnd coninutul variabilei de memorie nume2
se atribuie variabilei de memorie identificate cu nume1,
fcndu-se, dac este cazul, conversia de tip.
Atribuirea multipl.
Asociativitatea operatorilor de atribuire este de la dreapta la
stnga. Din aceast cauz, o expresie care foloseste atribuirea
multipl, de genul:
nume1=nume2=...=numen-1=numen=expresie1 =expresie2;
este greit, deoarece rezultatrul unei expresii nu poate fi atribuit
altei expresii.
Exemplu:
#include<iostream.h>
void main()
{unsigned int x,y;
float a;
a=x=y=5/2; cout<<a<<x<<y<<endl;
a=x=y=5./2; cout<<a<<x<<y<<endl;
x=y=a=5./2; cout<<a<<x<<y<<endl;}
//2 2 2
//2 2 2
//2.5 2 2
Atribuirea cu operator
Este de forma:
nume_variabil operator=expresie;
unde operator poate fi: +=, -=, *=, /=.
Modul de execuie:
- se evalueaz expresia;
- se aplic operatorul astfel: primul operand este numele
variabilei de memorie, iar al doilea operand este valoarea
expresiei, dac este cazul se face conversia de tip (v+=e;
v=v+e;);
- valoarea obinut se atribuie variabilei de memorie,
fcndu-se dac este cazul conversia de tip.
Atribuirea cu operator
Exemplu: #include<iostream.h>
void main()
{int a=10, b=20, c=30;
a+=b+c; cout<<a<<endl;
a=10; b=20; c=10;
a+=b+=c; cout<<a<<b<<endl;}
//60
//40 30
Observaie:
- se pot folosi atribuiri multiple cu operatori aritmetici
#include<iostream.h>
void main()
{int a=3;
float b=2;
cout<<(a>0?a:b)/2;}
//1.5
#include<iostream.h>
void main()
{int x;
cout<<x=; cin>>x;
cout<<(x%2==0?par:impar)<<endl;}
4.
#include<iostream.h>
void main()
{float x;
cout<<x=; cin>>x;
cout<<(int(x)==x?intreg\n:nu e intreg\n);}
#include<iostream.h>
void main()
{int a,b,c,max;
cout<<a=; cin>>a;
cout<<b=; cin>>b;
cout<<c=; cin>>c;
max=a;
max=max<b?b:max;
max=max<c?c:max;
cout<<maxim = <<max<<endl;}
6. #include<iostream.h>
void main()
{char c;
cout<<Dati caracterul: ; cin>>c;
cout<<(c>=a&&c<=z?(char)(c-32):
(c>=A&&c<=Z?(char)(c+32):c));}
Operatorul dimensiune
Operatorul dimensiune sizeof este un operator unar.
Operandul poate fi o expresie sau un tip de dat.
sizeof(expresie)
sizeof(tip_dat)
Rezultatul returnat de acesta reprezint numrul de octei
utilizai pentru a memora valoarea expresiei sau tipul de
dat precizat.
Aplicarea operatorului dimensiune pe o expresie nu are
ca efect i evaluarea acesteia.
Operatorul dimensiune
Exemplu:
1. #include<iostream.h>
void main()
{int a=5,b=10;
float c;
cout<<sizeof(int)<< <<sizeof(float)<<endl;
cout<<sizeof(c*a++)<<sizeof(a/b--)<<endl;
cout<<a<< <<b<<endl;}
//5 10
Operatorii de deplasare
Observaii :
Deplasarea a n bii la dreapta n operandul a
este echivalent cu ctul mpririi operandului a la 2n.
2.
Deplasarea a n bii la stnga n operandul a este
echivalent cu nmulirea operandului a cu 2n.
3.
Pentru a afia rezultatul operaiei de deplasare
la stnga a<<n, trebuie s ncadrai expresia ntre
paranteze rotunde : corect este cout<<(a<<n) ; i nu
cout<<a<<n ; La fel se procedeaz pentru afiarea
rezultatului operaiei de deplasare la dreapta a>>n.
1.
Exemplu :
#include<iostream.h>
void main()
{ int a=60,n=3;
cout<<(a>>n)<<endl;
}
a nainte de deplasare
00111100
// se afieaz 7
a>>>n
a dup deplasare
00000111
#include<iostream.h>
void main()
{ int a=15,n=3;
cout<<(a<<n)<<endl;
}
a nainte de deplasare
00001111
// se afieaz 120
a dup deplasare
a<<n
01111000
Operatorul I pe bii
Operatorul I pe bii a&b aplic operatorul logic I pe perechile de bii
de pe aceiai poziie din cei doi operanzi a i b: dac ambii bii sunt 1,
rezultatul este 1, altfel este 0.
Exemplu
#include<iostream.h>
void main()
{ unsigned int a=0xF2F, b=0x5;
cout<<(a&b);
}
a
0000111100101111
b
0000000000000101
a&b 0000000000000101
// se afieaz 5
// se afieaz 3882
0000111100101111
0000000000000101
0000111100101111
// se afieaz 3887
Precedena operatorilor
Nivel
Categoria
Operatori
Prioritate maxim
Operatori unari
+ ++ -!
sizeof
(tip)
* / %
+ -
== !=
&&
||
Operator condiional
?:
10
Operatori de atribuire
=
+= -= *= /=
11
Operator virgul
Funcii de sistem
Funcia
Tip rezultat
Tip parametru
Furnizeaz
Exemplu
abs(x)
fabs(x)
int
Double
Int
double
modulul
abs(-14)=14
fabs(-2.3)=2.3
floor(x)
floorl(x)
double
long double
double
long double
floor(11.5)=11
floor(-2.8)=-3
ceil(x)
ceill(x)
double
long double
double
long double
ceil(11.5)=12
ceil(-2.8)=-2
sin(x)
double
double
sinus de x
sin(0.5)=0.479426
cos(x)
double
double
cosinus de x
cos(0.5)=.877583
tan(x)
double
double
tangent de x
tan(0.5)=.546302
sqrt(x)
double
double
radical de ordinul
2 din x
sqrt(9)=3
pow(x,y)
pow10(x)
double
double
double
double
x la puterea y
10 la puterea x
pow(2,3)=8
pow10(3)=1000