PCLP4 - 1
Operatori
PCLP4 - 2
In cursul trecut
• Functia de intrare scanf()
• Alte functii de intrare/iesire
PCLP4 - 3
In cursul de astazi• Operatorii aritmetici
• Operatorii de incrementare/decrementare
• Operatorii booleeni
• Operatorii de atribuire
• Operatorul conditional, operatorul dimensiune
• Operatorii de fortare a tipului, operatorul virgula
• Operatorii paranteza
• Alti operatori
• Precedenta si asociativitatea operatorilor
PCLP4 - 4
Operatori (1)• Expresie – un operand sau mai multi conectati prin
operatori
• Operanzi
– constante
– variabile
– nume tablou
– nume tip de data
– elementele unui tablou
– apelul unei functii
– expresie intre paranteze
PCLP4 - 5
Operatori (2)
• aritmetici
• de incrementare/decrementare
• booleeni
• de atribuire
• conditional
• dimensiune
• de fortare a tipului
• virgula
• paranteza
PCLP4 - 6
Operatori aritmetici (1)• inmultire - *
• impartire - /
• modulo - % (doar pentru numere intregi)
• adunare - +
• scadere - -
Obs:
- se efectueaza *, / si % de la stanga la dreapta si
apoi + si – tot de la stanga la dreapta
- operatori binari
PCLP4 - 7
Operatori aritmetici (2)
• exemple:
4*5/2+5%2 = 20/2+1 = 10+1 =11
17%2 = 1
17.0 % 2 = operatie ilegala
17/2 = 8
17.0/2 = 8.5
x=17800+24000-24000 = 41800 -24000
depasire in int
PCLP4 - 8
Operatori aritmetici (3)
Regula conversiilor implicite – daca operatorul
binar se aplica la operanzi de tipuri diferite:
– char si enum -> int
– un operand long double ->long double
– un operand double -> double
– un operand float -> float
– un operand unsigned long -> unsigned long
– un operand long int -> long int
– unsigned si int -> int
PCLP4 - 9
Operatori aritmetici (4)
Exemplu:
int i;
long double a;
…
b = 3 * a + i;
long double
PCLP4 - 10
Operatori de incrementare/decrementare (1)
• incrementare - ++
preincre. ++x → x = x + 1 ← x++ postincre.
• decrementare - --
predecre. --x → x = x – 1 ← x-- postdecre.
Obs:
– operatori unari
– se aplica numai intregilor
PCLP4 - 11
Operatori de incrementare/decrementare (2)#include <stdio.h>
void main()
{ int x = 5, y = 10;
printf("x = %d\n", ++x);
printf("x = %d\n", --x);
printf("y = %d\n", (y = ++x - 2));
x = 5;
printf("y = %d\n", (y = x++ - 2));
printf("x = %d\n", x);
x = 0;
printf("y = %d\n", (y = x-- -1));
printf("x = %d\n", x);
}
x = 6
x = 5
y = 4
y = 3
x = 6
y = -1
x = -1
PCLP4 - 12
Operatori booleeni (1)- genereaza un rezultat logic TRUE (≠ 0) sau FALSE (0)
– relationali
– logici
– logici pe biti
1. Operatori relationali
– permit compararea a doua valori de acelasi tip
– se pot compara doua variabile sau expresii
– exceptie: int se poate compara cu float
– ==, !=, <, <=, >, >=
– au prioritate mai mica decat operatorii aritmetici si de
incr/decr
PCLP4 - 13
Operatori booleeni (2)Exemple:
5 == 5 → 1 (TRUE)
0.025 >= 0.333 → 0 (FALSE)
3 != 3 → 0 (FALSE)
-45.2 < -3 → 1 (TRUE)
'A' < 'Z' → 1 (TRUE)
int x=25, y=-10; x<=y → 0 (FALSE)
PCLP4 - 14
Operatori booleeni (3)
2. Operatori logici
! - negatia logica (NOT) – operator unar,
prioritate mai mare decat operatorii
multiplicativi
A !A
0
1
1
0
PCLP4 - 15
Operatori booleeni (4)
&& - SI logic (AND) – operator binar, are prioritate
mai mica decat operatorul de egalitate
A B A&&B
0
0
1
1
0
1
0
1
0
0
0
1
PCLP4 - 16
Operatori booleeni (5)
|| - SAU logic (OR) – operator binar, are
prioritate mai mica decat operatorul &&
A B A|| B
0
0
1
1
0
1
0
1
0
1
1
1
Obs: expresia se evalueaza de la stanga la dreapta. Daca se
ajunge intr-un punct in care se cunoaste valoarea de adevar a
intregii expresii, atunci restul expresiei nu se mai evalueaza.
PCLP4 - 17
Operatori booleeni (6)3. Operatori logici pe biti
se aplica la operanzi de tip intreg
~ - complement fata de 1, operator unar
& - SI logic pe biti
| - SAU logic pe biti
^ - SAU EXCLUSIV logic pe biti
<< - deplasare stanga
>> - deplasare dreapta
A B A^B
0
0
1
1
0
1
0
1
0
1
1
0
PCLP4 - 18
Operatori booleeni (7)Exemple:
int a = 9; → 00001001
~a → 11110110
a << 3 → 01001000
a >> 2 → 00000010
int a = 6; → 00000110
int b = 10; → 00001010
a & b → 00000010
a | b → 00001110
a ^ b → 00001100
PCLP4 - 19
Operatori booleeni (8)Exemplu: Se citeste un numar si daca este in intervalul
[0,100] se afiseaza 1, altfel se afiseaza 0.
#include <stdio.h>
int main()
{ double a;
printf (″Introduceti numarul:″);
scanf (″%lf″, &a);
printf (″a=%lf\t%d\n″,a, a>=0 && a<=100);
return 0;
}
PCLP4 - 20
Operatori de atribuire (1)
1. Atribuire simpla =
v = expresie
ex. a = 17;
pi = 3.14;
tensiune = rezistenta * curent;
v = a + v1;
Obs. - asociativitate de la dreapta la stanga
PCLP4 - 21
Operatori de atribuire (2)
2. Atribuire compusa op=
unde op poate fi: /, *, %, -, +, <<, >>, &, ^, |
si unde:
v op= expresie ≡ v = v op (expresie)
ex.:
i += 9; ≡ i = i + 9;
i *= j +7; ≡ i = i * (j + 7);
int a = 9;
a >>= 2; ≡ a = a >> 2; → a = 2
PCLP4 - 22
Operatori de atribuire (3)Exemplu: Sa se calculeze valorile expresiilor 2x2+3x si
2x2+3x-10 pentru x citit de la consola.
#include <stdio.h>
int main()
{ double x, y;
printf(″introduceti numarul:″);
scanf(″%lf″, &x);
printf(″x=%.2lf, y=2*x*x+3*x=%.2lf\n″, x, y=2*x*x+3*x );
y -= 10;
printf(″x=%.2lf, y=2*x*x+3*x-10=%.2lf\n″, x, y);
return 0;
}
PCLP4 - 23
Operatorul conditional (1)expresie1 ? expresie2 : expresie3
- expresie1 este o conditie
ex. int a = 9, b = 14;
b = (b>a)?(a+1):(a-1);
Exemplul 1: Afisarea valorii absolute a unui numar.
#include <stdio.h>int main(){ int a;
scanf(″%d″, &a);printf(″a=%d\tabs(a)=%d\n″, a, a<0 ? –a : a);return 0;
}
PCLP4 - 24
Operatorul conditional (2)
Exemplul 2: Sa se afiseze minimul dintre valorile a
doua numere intregi citite de la consola.
#include <stdio.h>
int main()
{ int x, y;
printf(″introduceti numerele:″);
scanf(″%d%d″, &x, &y);
printf(″x=%d, y=%d, min(x,y)=%d\n″,x, y, x<y?x:y);
return 0;
}
PCLP4 - 25
Operatorul conditional (3)Exemplul 3: Sa se afiseze minimul dintre valorile
absolute a doua numere intregi citite de la consola.
#include <stdio.h>
int main(){ int x, y, a, b;
printf(″introduceti numerele:″); scanf(″%d%d″, &x, &y);printf(″x=%d, y=%d, abs(x)=%d, abs(y)=%d\n″,x, y,\
a=x<0?–x:x, b=y<0?-y:y);printf(″min( abs(x),abs(y))=%d\n″, a<b?a:b);return 0;
}
PCLP4 - 26
Operatorul dimensiune- operator unar cu precedenta mare
sizeof data
sizeof (tip)ex.1 int x, y;
printf(″y = %d\n″, y = sizeof x);
ex.2 double x[8];int a, b;a = sizeof x[4];b = sizeof x;
ex.3 a = sizeof (char);
a 8
y 4
b 64
a 1
PCLP4 - 27
- operator unar cu precedenta mare
(tip) operandExemplul 1: Calculeaza radacina patrata a unui
numar intreg citit de la consola.
#include <stdio.h>#include <math.h>int main(){ int nr;
printf(″introduceti numarul:″); scanf(″%d″, &nr);printf(″nr=%d, sqrt(nr)=%lf\n″, nr, sqrt((double)nr));return 0;
}
Operatorul de fortare a tipului (1)
double sqrt(double);
PCLP4 - 28
Exemplul 2: Afiseaza valoarea expresiei (x+1)/x cu 8
zecimale pentru un numar intreg citit de la consola.
#include <stdio.h>int main(){ int x;
printf(″introduceti numarul:″); scanf(″%d″, &x);printf(″x=%d, (x+1)/x=%.8lf\n″, x, ((double)x+1)/x);return 0;
}
Operatorul de fortare a tipului (2)
(x+1)/x este intreg !!!
PCLP4 - 29
Operatorul virgulaexpresie1 , expresie2 , expresie3, …, expresieN
Exemplu: Sa se afiseze maximul dintre valorile absolute a doua numere intregi citite de la consola.
#include <stdio.h>int main(){ int x, y, a, b;
printf(″introduceti numerele:″); scanf(″%d%d″, &x, &y);printf(″x=%d, y=%d, max( abs(x),abs(y))=%d\n″, x,\y, ((a=x<0?–x:x), (b=y<0?-y:y), (a>b?a:b)));return 0;
}
PCLP4 - 30
Operatorii paranteza(expresie)
- au prioritatea cea mai mare
- impun ordinea efectuarii operatiilor
- nu se aplica operatorilor de incrementare/decrementare
si operatorului adresa:
(a+10)++; --(x+y); &(i+j);
[expresie]
- utilizate pentru indicii tablourilor (op. de indexare)
ex.: a[7]; a[2*i+j]
PCLP4 - 31
Alti operatori• operatorul adresa (de referentiere) – &
• operatorul de indirectare (de dereferentiere) – *
• operatorii de accesare a componentelor unei structuri – . si ->
• operatorii unari + si -
b= +a; b = -a
ex.: int x, *pa, a[10];
pa = &a[7];
x = *pa;
*&x;
PCLP4 - 32
Precedenta operatorilor( ) [ ] . ->(tip) sizeof ++ -- ! ~ + - & * ←op.unari* / %+ -<< >>< <= > >=== !=&^|&&||?:= += -= *= /= %= <<= >>= &= |= ^=,
PCLP4 - 33
Asociativitatea operatorilor
• operatorii unari, de atribuire si cel conditional au asociativitatea de la dreapta la stanga
. (tip) sizeof ++ -- ! ~ + - & *
= += -= *= /= %= <<= >>= &= |= ^=
?:
• ceilalti operatori au asociativitatea de la stanga la
dreapta
PCLP4 - 34
ExempluExemplu: Sa se converteasca litera mica citita in litera mare.
#include <conio.h>int main(){ char c;
c = getche();c = c – ('a' -'A‘);putch(c);return 0;
}sau
#include <conio.h>int main(){ putch(getche() – 'a' +'A' );
return 0;}
PCLP4 - 35
Codul
ASCII