Extras din curs
II. Operatori si expresii.
Un operator este un simbol care arata ce operatii se executa asupra unor operanzi (termeni).
Un operand este o constanta, o variabila, un nume de functie sau o subexpresie a carei valoare este prelucrata direct de operator sau suporta în prealabil o conversie de tip.
Operatorii, dupa numarul de operanzi asupra carora se aplica pot fi: unari, binari si ternari.
În C exista 45 de operatori diferiti dispusi pe 15 niveluri de prioritate.
În functie de tipul operanzilor asupra carora se aplica, operatorii pot fi: aritmetici, relationali, binari, logici, etc.
Operatorii sunt împartiti în clase de precedenta (sau de prioritate). În fiecare clasa de precedenta este stabilita o regula de asociativitate, care indica ordinea de aplicare a operatorilor din clasa respectiva: de la stânga la dreapta sau de la dreapta la stânga.
O expresie este o combinatie de operanzi, separati între ei prin operatori; prin evaluarea unei expresii se obtine o valoare rezultat.Tipul valorii rezultat depinde de tipul operanzilor si a operatorilor folositi.
Evaluarea unei expresii poate avea efecte laterale, manifestate prin modificarea valorii unor variabile.
1. Conversii de tip.
Valorile pot fi convertite de la un tip la altul. Conversia poate fi implicita sau realizata în mod explicit de catre programator.
1.1. Conversii implicite de tip.
Conversiile implicite au loc atunci când este necesar ca operatorii si argumentele functiilor sa corespunda cu valorile asteptate pentru acestea.
Acestea pot fi sintetizate prin tabelul:
Tip Tip la care se converteste implicit
char int, short int, long int
int char (cu trunchiere)
short int (cu trunchiere)
long int (cu extensia semnului)
short int ca si int
long int ca si int
float double
int, short int, long int
double float
int, short int, long int
1.2. Conversii aritmetice.
Când un operator binar se aplica între doi operanzi de tip diferit, are loc o conversie implicita a tipului unuia dintre ei, si anume, operandul de tip “mai restrâns” este convertit la tipul “mai larg” al celuilalt operand. Astfel în expresia f + i, operandul int este convertit în float.
Operatorii aritmetici convertesc automat operanzii la un anumit tip, daca operanzii sunt de tip diferit. Se aplica urmatoarele reguli:
• operanzii char si short int se convertesc în int; operanzii float se convertesc în double.
• daca unul din operanzi este double restul operanzilor se convertesc în double iar rezultatul este tot double.
• daca unul din operanzi este long restul operanzilor se convertesc în long , iar rezultatul este tot long.
• daca unul din operanzi este unsigned restul operanzilor se convertesc în unsigned , iar rezultatul este tot unsigned.
• daca nu se aplica ultimele 3 reguli, atunci operanzii vor fi de tip int si rezultatul de asemeni de tip int.
double ¬float
long
unsigned
int ¬char, short
Astfel n = c - ‘0’ în care c reprezinta un caracter cifra calculeaza valoarea întreaga a acestui caracter.
Conversii implicite se produc si în cazul operatiei de atribuire, în sensul ca valoarea din partea dreapta este convertita la tipul variabilei acceptoare din stânga.
Astfel pentru declaratiile:
int i;
float f;
double d;
char c;
sunt permise atribuirile:
i=f; /* cu trunchierea partii fractionare */
f=i;
d=f;
f=d;
c=i;
i=c;
1.3. Conversiile de tip explicite (cast).
Conversiile explicite de tip (numite si cast) pot fi fortate în orice expresie folosind un operator unar (cast) într-o constructie de forma:
(tip) expresie
în care expresia este convertita la tipul numit.
Operatorul cast are aceeasi precedenta cu a unui operator unar.
Astfel functia sqrt() din biblioteca <math.h> cere un argument double, deci va fi apelata cu un cast: sqrt((double) n).
Apelurile cu argumente de alt tip vor fi convertite în mod automat la tipul double: x=sqrt(2) va converti constanta 2 în 2.0.
2. Operatorii aritmetici.
Operatorii aritmetici binari sunt: +, -, *, / si % (modul = restul impartirii întregi).
Prioritatea operatorilor aritmetici este:
+, - unari
*, /, % binari
+, - binari
Regula de asociativitate este de la stânga la dreapta (la prioritati egale operatorii sunt evaluati de la stânga la dreapta).
Operatori multiplicativi
operator descriere tip operanzi tip rezultat precedenta
* înmultire aritmetic int,unsigned,long,double 3
/ împartire aritmetic int,unsigned,long,double 3
% restul împartirii întregi întreg int,unsigned,long 3
Operatori aditivi
operator descriere tip operanzi tip rezultat precedenta
+ adunare aritmetici
pointer si întreg int,unsigned,long,double
pointer 4
- scadere aritmetici
pointer si întreg
doi pointeri int,unsigned,long,double
pointer
int 4
Preview document
Conținut arhivă zip
- Tipuri,variabile,operatori si expresii in C si C++.DOC