CATEGORII DOCUMENTE |
Expresii si operatori
1.Definitia unei expresii
2.Tipuri de operatori
1. Definitia unei expresii
O expresie este formata dintr-un unul sau mai multi operanzi legati prin operatori.
Operand poate fi:
o constanta
o constanta simbolica( definita prin #define)
numele unei variabile simple
numele unui tablou
numele unei structuri
numele unei functii
elementul unui tablou
apelul unei functii
expresii incluse intre paranteze rotunde
Exemplu:
a+b;
Operatorii, in functie de numarul de operanzi carora li se aplica, sunt:
unari
binari
ternari
Un operator unar se aplica unui singur operand, cel binar la doi operanzi si cel ternar la trei operanzi.
(operatorul binar se aplica la operandul care il precede si la cel care il urmeaza)
exemplu x+y ->operatorul binar + se aplica asupra operandului x care face apelul operatorului si asupra lui y.
Obs: La evaluarea unei expresii este necesar sa se tina seama de urmatoarele:
prioritatile operatorilor care apartin diferitelor clase de operatori
de asociativitatea operatorilor de aceiasi clasa si au aceiasi prioritate
de regula conversiilor implicite
Operatori aritmetici :-, +, /, %, *
pot fi atit unari (- , +) sau binari (*, /, %, -, +)
Obs: Operatorul modulo (%) se aplica numai la operanzi intregi si are ca rezultat restul impartirii intregi a valorilor operanzilor sai.Operatorul (/) in cazul in care ambii operanzi sint intregi realizeaza o impartire intreaga.
formeaza o expresie de forma:
(e1 operator de reletie e2) -unde e1,e2 sint expresii.
Valorea expresiei dintre parantezele rotunde are valoarea 1 daca valorile celor doua expresii e1 si e2 satisfac relatia prin care sint legate in caz contrar va afea valoarea 0.
Exemplu:
int x=5, y=7;
Expresia : (x<y) ->are valoarea 1
Expresia: (x>y) -> are valoarea 0
Operatori de egalitate: = =(egal), !=(diferit)
formeaza expresii similare operatorilor de relatie si se evalueaza la fel.
Exemplu:
Expresia: (x= =y*y)
se evalueaza mai intii expresia y*y pentru ca acest operator este prioritar si apoi valoare expresiiei se aplica operator de egalitate.
expresia putem spune ca este adevarata daca valoarea lui x este egala
cu patratul valori lui y , altfel este falsa (egala cu 0).
Exemple:
int x;
(x%4= =0) -sa se evalueze expresia in functia de valoarea lui x.
(x%100!=0) - expresia este adevarata daca x nu este multiplu de 100.
(scanf("%d",&x)= =1) - expresia este adevarata daca s-a citit un intreg de la tastatura.
Operatori logici : ! (not -negatie), && (si logic), || (sau logic)
pot forma expresii de forma:
(!operand) - expresia are valoarea 1 daca operand are valoarea 0 si are valoarea 0 daca operand are o valoare diferita de zero.
(e1&&e2) - expresia are valoarea 1 daca expresiile e1 si e2 sint adevarate(diferite de zero) altfel expresia are valoarea 0.
(e1||e2) - expresia are valoarea 1 in cazul in care cel putin una din cele doua expresii e1 sau e2 este adevarata si are valoarea 0 cind ambele expresii sint false (au valori egale cu 0).
Exercitii:
Fie int a,b;
Se da expresia: (!a&&b)
Obs:operatorul ! este prioritar lui &&
a) -sa se evalueze valoarea expresiei in cazul in care a=0 si b=7
b) -sa se evalueza valoarea expresiei in cazul in care a=3 si b=3
c) -aceleasi cerinte in cazul in care se inlocuieste operatorul && cu || (sau).
Operatori logici pe biti :
~ -complement fata de unu (operator unar)
<<- deplasare la stinga(siftare la stinga)
>>-deplasare la dreapta(siftare la dreapta)
&-si logic pe biti
|-sau logic pe biti
^-sau exclusiv logic pe biti
Obs: acesti operatori se aplica operanzilor de tip intreg si se executa bit cu bit.
a) Complementul fata de unu
are aceiasi prioritate cu ceilalti operatori unari
efectul aplicarii acestui operator este schimbarea fiecarui bit 0 cu valoarea 1 cu 0 si fiecare bit 0 al operandului in 1.
Exemplu 1:
int a=2; ->in binar :00000010
~a ; => 11111101
Exemplu 2:
-> -2 in binar :11111110 (reprezentarea lui -2 in binar se face in 2 pasi ,mai intii se obtine complementul fata de unu si apoi se aduna 1).
Obs: operatorii unari au aceeasi prioritate, iar atunci cind apar mai multi in componenta unei expresii se asociaza de la dreapta la stinga.
pentru evaluarea expresiei de mai sus se face mai intii negativarea operandului si apoi complement fata de unu.
rezultatul aplicarii celor doi operatori este: 00000001
b) Operatorii de siftare la stinga si la dreapta
operatorul de siftare la stinga realizeaza o deplasare la stinga valorii primului operand cu un numar de pozitii binare egal cu valoarea celui de-al doilea operand al sau.
aceasta operatie este echivalenta cu inmultirea cu puteri ale lui 2.
similar este pentru siftare la dreapta ,deplasarea se face spre dreapta
siftarea la dreapta este echivalenta cu impartirea cu puteri ale lui 2.
Exemplu:
int a;
a<<3 ->este echivalenta cu a*2
a>>3 ->este echivalenta cu a/2
c) Operatorul si logic pe biti
se executa bit cu bit conform tabelei:
& | ||
-se utilizeaza pentru anulari de biti
d) Operatorul sau logic pe biti
se executa bit cu bit conform tabelei:
-se utilizeaza la setari de biti
e) Operatorul sau exclusiv pe biti
se executa bit cu bit conform tabelei:
-este utilizat pentru a anula sau pozitiona diferiti biti.
Operatorii de atribuire : =, +=, -=, *= etc.
aplicarea operatorului de atribuire simpla are ca efect asignarea valorii expresiei aflata in dreapta semnului de atribuire variabilei din stinga operatorului.
V=(expresie);
daca tipul expresiei din dreapta este diferit de cel al variabilei din stinga operatorului si este posibil ,se face o conversie spre tipul variabilei din stinga inainte de a se face asignarea valorii.
in cazul unei expresii de genul v=v1=v2=v3=expresie evaluarea expresiei se face de la dreapta la stinga.
atribuirea de produs ,cit ,suma ,diferenta etc se face dupa modelul:
i+=3 ->este echivalenta cu: i=i+3;
Operatorii de incrementare si decrementare : --, ++
efectul aplicarii acestora este marirea respectiv scaderea valorii operandului caruia i se aplica cu 1.
sint operatori unari, care pot fi folositi prefixat sau postfixat;
exemplu:
++operand ->prefixati
in expresii se foloseste valoarea operatorului la care s-a aplicat operatorul respectiv.
operand++ ->postfixat
in expresii se foloseste valoarea operandului de dinaintea aplicarii operatorului.
Operatorul dimensiune: sizeof
efectul aplicarii acestui operator este calculul dimensiunii in octeti a tipului operandului respectiv.
Exemplu:
sizeof(data) sau sizeof(tip) - data poate fi:
nume variabila predefinita
nume de tablou
nume de structura
referire la elementul unui tablou sau al unei structuri.
Tip poate fi:
un tip predefinit
un tip definit de utilizator
sizeof(int) ->expresia are ca valoare numarul de octeti necesari pentru reprezentarea tipului int (4B) .
double t;
sizeof(t) ->expresia are ca valoare numarul de octeti pe care se reprezinta variabila t al carui tip este double (8B).
Operatorul adresa : &
este un operator unar si se aplica la numele unei variabile pentru a determina adresa de inceput a zonei de memorie alocate variabilei respective. (&nume)
Operatorul paranteze rotunde ()
operator cu prioritate maxima
se utilizeaza pentru a include o expresie si la apelul unei functii.
Obs:O expresie inclusa intre paranteze rotunde formeaza un operand (in felul acesta se poate impune o alta ordine in efectuarea operatiilor).
operanzii obtinuti prin includerea unei expresii intre paranteze rotunde impune anumite limite asupra operatorilor:
la un astfel de operand nu se pot aplica operatorii de incrementare/decrementare sau operatorul adresa.
(i+10)++;
--(x+y);
&(x+y); -> toate acestea sint expresii eronate
Operatorul de indexare: []
parantezele patrate includ expresii care reprezinta indici, folositi pentru a referii elementele unui tablou.
Operatorul conditional : ? si :
este singurul operator ternar (se aplica la trei operanzi)
cu ajutorul operatorului conditional se construiesc expresii conditionale , expresii a caror valoare depinde da valoarea unei conditii.
expresia conditionala are formatul:
e1 ? e2 : e3
evaluarea expresiei conditionale:
1.se evalueaza expresie e1
2.daca valoarea expresiei e1 este 1(sau un numar diferit de zero) atunci se evalueaza expresia e2 a carei valoare este data expresiei conditionale.
3.daca valoarea expresiei e1 este egala cu zero atunci se evalueaza expresie e3 si valoarea acestuia este valoarea expresiei conditionale.
Exemplu: Calculul maximului dintre doua numere
Fie : int a=9,b=2,Max;
Max=(a>b)?a:b; -daca expresia a>b este adevarata maximul va fi egal cu valoarea lui a, daca aceasta este falsa maximul este egal cu valoarea lui b.
Tema laborator:
Sa se scrie un program care sa citeasca doi intregi de la tastatura si sa afiseze maximul dintre valorile lor absolute.
Operatorul virgula
leaga doua expresii in una singura conform formatului:
exp1,exp2 -valoarea si tipul expresiei coincide cu valoarea si tipul ultimei expresii.
are cea mai mica prioritate dintre toti operatorii.
expresiile in care apare operandul virgula se evalueaza pe rind de la stinga la dreapta.
se foloseste in situatii in care intr-un anumit punct al unui program in care este corect sa apara o expresie, este necesar sa se realizeze un calcul complex exprimat prin mai multe expresii.
Exemplu:program care citeste doi intregi si afiseaza maximul dintre valorile lor absolute.
#include<stdio.h>
void main()
Explicatii: expresia ((c=a<0 ?-a : a),(d=b<0 ?-b : b),(c>d ?c : d)) se compune din trei expresii ,legate prin operatorul virgula, si se evalueaza de la stinga la dreapta
1.se evalueaza prima expresie si se atribuie lui c valoarea absoluta a lui a.
2.se evalueaza a doua expresie si atribuie lui d valoarea absoluta a lui b
3.se evalueaza expresia a treia functie de valorile expresiilor anterioare, iar valoarea rezultata din evaluarea acestei expresii conditionale este afisata.
Conversii implicite si operatorul cast (de conversie explicita sau fortare a tipului)
Conversii implicite:
se realizeaza o conversie implicita atunci cind un operator se aplica la doi operanzi de tipuri diferite.
in acest caz operandul de tip "inferioar" se converteste spre tipul "superior" al celuilalt operand iar rezultatul este de tipul "superior".
daca operatorul curent se aplica la operanzi de acelasi tip, se executa operatorul respectiv iar tipul rezultatului coincide cu tipul comun al operanzilor.insa daca rezultatul aplicarii operandului este o valoare in afara limitelor tipului comun al operanzilor atunci rezultatul este eronat.
Exemplu:
int i=5;
double a=2.5;
a*3+i; -pentru evaluarea expresiei se converteste mai intii 3 spre double apoi se realizeaza inmultirea dupa care se converteste si i catre double si abia apoi se efectueaza si operatia de adunare.
Operatorul cast (conversie explicita):
se considera operator unar si are forma generala:
(tip) operand ->valoarea operand se converteste spre tipul indicat in paranteze daca este posibil;
expresia : (tip) operand; se numeste expresie cast.
Exemplu:
int t;
double x=2.6;
t=(int)x; ->se face o conversie explicita a lui x care este de tip double catre int.
Obs: fara aceasta conversie se face totusi atribuirea dar este semnalat la compilare printr-un mesaj care avertizeaza ca aceasta atribuire poate afecta acuratetea rezultatului.
Categorie |
Operatori |
Semnificatie |
1.Prioritate maxima |
-> . |
Apel de functie Expresie cu indici Selectori de membru la structuri si clase |
2.Operatori unari |
& sizeof (tip) |
Negare logica Negare bit cu bit(complement fata de unu) Plus si minus unari Incrementare/decrementare Adresa Indirectare Dimensiune operand(in octeti) Conversie explicita de tip(cast) |
3.Operatori multiplicativi |
Inmultire impartire rest |
|
4.Operatori aditionali |
Plus si minus binari |
|
5.Deplasari |
<< >> |
Deplasare stinga dreapta |
6.Relationali |
< <= > >= |
Mai mic, mai mic sau egal, mai mare, mai mare sau egal |
7.Egalitate |
!= |
Egal, diferit |
& |
Si logic bit cu bit |
|
Sau exclusiv bit cu bit |
||
Sau logic bit cu bit |
||
&& |
Si logic |
|
Sau logic |
||
13.Operator conditional |
Operator conditional (ternar) |
|
14.operatori de atribuire |
&= ^= |= <<= >>= |
Atribuire simpla Atribuire produs cit rest Atribuire suma diferenta Atribuire si, sau exclusiv,sau (bit cu bit) Atribuire deplasare stinga /dreapta |
15.Virgula |
Evalueaza exp1,exp2.Valoarea expresiei este exp2. |
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1726
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved