Sunteți pe pagina 1din 17

Operații și expresii în limbajului C

Generalități
 Limbajul C, comparativ cu alte limbaje de nivel înalt, posedă o
nomenclatură de operații cu date mai dezvoltată.
 O expresie în limbajul C este formată dintr-un operand sau
operanzi legați între ei prin operatori.
 Compilatorul C realizează regruparea expresiilor, încercând
să creeze expresii efective pentru compilare. Însă, expresiile
cu plus unar nu se regrupează.
 O expresie are o valoare şi un tip care se determină aplicând
operatorii conform priorităților şi asociativității acestora.
 În limbajul C operatorii se asociază de la stânga la dreapta,
exceptând operatorii unari şi de atribuire, care se asociază de
la dreapta la stânga.
 Totodată pot fi folosite parantezele rotunde pentru a impune o
anumită ordine în executarea operațiilor.
Operanzi
Un operand în limbajul C poate fi:
 o constantă;
 o constantă simbolică;
 numele unei variabile simple;
 numele unei funcții;
 apelul unei funcții;
 numele unui tablou;
 referirea la elementul unui tablou (variabilă cu indici);
 numele unei structuri;
 referirea la elementul unei structuri;
 o expresie inclusă în paranteze rotunde.
Operatori
Operatorii limbajului C se împart în clase de prioritate, fiecare clasă având
o regulă de asociativitate, care indică ordinea aplicării operatorilor
consecutivi de aceeași prioritate.
Principalele tipuri de operatori sunt:
 aritmetici
 relaționali
 logici
 de atribuire
 de atribuire augmentată (compusă)
 de incrementare/ decrementare
 de evaluare condițională
 logici pe biți (nu se vor studia)
 Etc.

Operatorii au arități diferite: unari, binari, ternari.


Operatori aritmetici
Operatorii aritmetici sunt:
 - (minus unar);
 + (plus unar);
 * / % (operatori binari multiplicativi: înmulțire, împărțire,
restul împărțirii întregi);
 + - (operatori binari aditivi: adunare şi scădere).

Remarcă:
• la împărțirea unui număr întreg la alt număr întreg partea fracționară se anulează.
De exemplu: expresia 5/2 are valoarea 2, şi nu 2.5!
Pentru a obține o valoare exactă de la împărțirea lui 5 la 2, trebuie să scriem expresia
aceasta astfel, încît măcar unul din operanzii ei să nu fie de tip întreg, de exemplu, 5/2.0 sau
5.0/2, sau 5.0/2.0
• În limbajul C lipsește operația de ridicare la putere. Ea se realizează printr-o funcție
matematică încorporată în fișierul math.h
Operatori relaționali
Operatorii relaționali sunt:
 == (egal)
 != (diferit)
 < (mai mic)
 <= (mai mic sau egal)
 > (mai mare)
 >= (mai mare sau egal)

! Rezultatul aplicării unui operator relațional este:


• 0 (pentru cazul cu valoarea logică fals)
• 1 (pentru cazul cu valoarea logică adevărat)

! Dintre operațiile de relație: primele 2 au o prioritate mai mică decât ultimele


4, care au aceeași prioritate între ele.
Operațiile de relație se pot folosi pentru toate tipurile de date de bază, cu
excepția șirurilor de caractere (la care se folosesc funcțiile încorporate).
Operatori logici
Operatorii logici sunt:
! (NU logic - operator unar);
 && (ŞI logic);
 || (SAU logic).

• Operatorul “!” are aceeași prioritate cu operatorii unari “+” şi “-“.


• Operatorul “&&” este mai prioritar decât operatorul “||”, dar are o prioritate mai
mică decât operatorii de egalitate (== și !=).

! În limbajul C nu există valori logice speciale. Valoarea fals se reprezintă prin zero.
Orice valoare diferită de zero reprezintă valoarea adevărat.

Ex. Expresia de relație a>b==2 întotdeauna va avea valoarea 0 (fals), căci, independent de
valoarea variabilelor, subexpresia a>b va avea valoarea 0 sau 1 şi compararea oricărei
din aceste valori cu 2 ne dă 0.
Operatorul de atribuire
Operatorul de atribuire se notează cu “=” şi se utilizează în expresia de atribuire:
v=expresie;
unde v este o variabilă simplă, fie variabilă cu indici sau un element de structură.

O expresie de forma: v1=(v=expresie); este şi ea legală şi se efectuează în


felul următor :
 se evaluează expresie şi valoarea ei se atribuie lui v;
 apoi valoarea lui v se atribuie şi lui v1.

Deoarece operatorii de atribuire se asociază de la dreapta la stânga, expresia de


mai sus se poate scrie şi fără paranteze: v1=v=expresie;

În general, se pot realiza atribuiri multiple printr-o expresie de forma:


vn =. . . =v1=v=expresie
Dacă expresia din dreapta semnului egal are un tip diferit de cel al variabilei v, atunci întâi
valoarea ei se convertește spre tipul variabilei v şi pe urmă se realizează atribuirea.
Operatorii de atribuire augmentată (compusă)
Operatorii de atribuire augmentată se notează cu “op=” şi se utilizează astfel:
v op=expresie;
unde prin op se consideră unul din operatorii binari aritmetici sau logici pe biţi:
* / % - + & ^ | << >>
Acest mod de construcție se folosește pentru a compacta un anumit tip de atribuire.
Astfel, expresia v op = expresie; este identică cu v = v op expresie;

De exemplu, d+=2 este echivalent cu d=d+2.


Operatorii de incrementare/ decrementare
Operatorii de incrementare/decrementare se notează cu “++” şi “--” respectiv și se
folosesc pentru mărirea/micșorarea cu 1 a valorii operandului indicat.

Operatorii respectivi sunt folosiți prefixat şi postfixat.


• operatorii prefixați au notația: ++operand; -- operand;
Ei se aplică mai întâi şi apoi se folosește valoarea operanzilor.
• operatorii postfixaţi au notația: operand++; operand --;
Se folosește valoarea operanzilor şi apoi se aplică incrementarea sau decrementarea.

Exemple:
j=i++; este echivalent cu secvența de executat: j=i și apoi i=i+1;
y=--x; este echivalent cu secvența de executat: x=x-1 și apoi y=x;

! Acești operatori se pot aplica numai la următorii operanzi:


1. variabilă simplă;
2. variabilă cu indici;
3. referire la elementul unei structuri.
Operatorii de evaluare condițională
Operatorii de evaluare condițională se notează cu “?” şi “:” și se folosesc
doar împreună pentru a exprima instrucțiunea condițională IF ca o expresie
condițonală de forma: expresie0?expresie1:expresie2;

Evaluarea se face astfel:


 se evaluează expresia expresie0;
 dacă expresie0 este diferită de zero, atunci valoarea şi tipul expresiei condiționale sunt
egale cu valoarea şi tipul expresiei expresie1; altfel cu expresia expresie2.
Exemple:
max= a>b?a:b; este echivalent cu secvența de executat:
if a>b then max=a else max=b;

! Acești operatori sunt unicii ternari (implică 3 operanzi).


Are prioritatea mai ridicată doar decât a operatorilor de atribuire şi a celui secvențial, iar asociativitatea este de
la dreapta spre stânga.
Operatorul , (virgulă)
Operatorul virgulă se notează cu “,” şi este folosit pentru gruparea mai multor
expresii într-una singură astfel:
expresie1,expresie2,…,expresieN;

Această expresie compusă are valoarea şi tipul ultimei expresii (expresieN).

De exemplu, k=(i=10, j=i+5, i+j) este echivalent cu executarea următoarelor


operații: i=10; j=i+5; k=i+j;

! Acest operator are prioritatea cea mai mică, iar asociativitatea este de la dreapta spre stânga.
Operatori – prioritatea lor:
I ( ) [ ] var++ var-- . ->
II- (unar) +(unar) *(unar) &(unar) ++var --var ! ~ (tip) sizeof
III* / %
IV + -
V << >>
VI < <= >= >
VII == !=
VIII&
IX ^
X |
XI &&
XII ||
XIII? : (ternar)
XIV = op= (op poate fi: *(binar) / % +(binar) –(binar) << >> & ^ | )
XV ,