220 likes | 559 Views
Programare in limbajul C – Cursul 3 Expresii şi operatori Prof. univ. dr. Constantin Popescu. Agenda. Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici Operatii pe biti Operatorul conditional. Expresii.
E N D
Programare in limbajul C – Cursul 3Expresii şi operatoriProf. univ. dr. Constantin Popescu
Agenda • Expresii • Operatori aritmetici • Operatori de asignare • Operatori de incrementare si decrementare • Operatori relationali • Operatori logici • Operatii pe biti • Operatorul conditional
Expresii • Exemple de expresii: 3 + 5; x; x=0; x=x+1; printf("%d",x); • Doua tipuri de expresii: • Apeluri de functii • Expresii formate din date si operatori • O expresie in C are de obicei o valoare • exceptie pentru apelurile de functii care returneaza void.
Operatori Aritmetici Operator Simbol Actiune Exemplu Adunare + Aduna operanzii x + y Scadere - Scade al 2 din primul x - y Negare - Neaga operandul -x Inmultire * Inmulteste operanzii x * y Impartire / Imparte 1 la al doilea x / y Rest % Restul impartirii x % y
Operatorul de asignare • x=3 • = este un operator • valoarea acestei expresii este 3 • = are urmatorul efect -- asigneaza lui x valoarea 3 • Operatorul de asignare = • Asigneaza partii din stinga valoarea din partea dreapta. • Valoarea expresiei va fi valoarea din partea dreapta. • Exemplu: x = ( y = 3 ) +1; /* asigneaza lui y valoarea 3 */ /* valoarea lui (y=3) este 3 */ /* asigneaza lui x valoarea 4 */
Operatori de asignare compusi • Adesea se utilizeaza operatorii: • x=x+1, x=x*2, ... • Limbajul C ofera o forma scurta pentru acestia: • Forma Generica: variabila op= expr echivalent cu variabila = variabila op expr • Ultima valoare va fi egala cu valoarea finala a lui expr • De exemplu: x=3; y= (x+=3); /* x si y au fiecare valoarea 6 */ OperatorEchivalent cu: x *= y x = x * y y -= z + 1 y = y - (z + 1) a /= b a = a / b x += y / 8 x = x + (y / 8) y %= 3 y = y % 3
Operatori de Incrementare si Decrementare • Operatori pre- si post-incrementare si decrementare: • Incrementare: ++ ++x, x++ • ++x este echivalent cu : (x = x + 1) • Are valoarea xvechi +1 • Este incrementat x • x++ • Are valoarea xvechi • Este incrementat x • Decrementare -- --x, x-- • similar cu ++
Operatori Relationali • Operatorii relationali permit compararea variabilelor: • Ei returneaza val. 1 pentru true si val. 0 pentru false. Operator Simbol Exemplu Egalitate == x == ydiferit de x = y Mai mare > x > y Mai mic < x < y Mai mare/egal >= x >= y Mai mic/egal <= x <= y Inegalitate != x != y • Nu exista tipul boolean in C. In C se foloseste: • 0, pentru false (fals) • Intreg diferit de zero, pentru true (adevarat)
Operatori Logici • && si • || sau • ! negare (operator unar) !((a>1)&&(a<10))||((a<-1)&&(a>-10))
Operatii pe biti (1) • C permite reprezentarea pe biti a variabilelor intregi • Toti intregii pot fi reprezentati in forma binara: • De exemplu, daca avem intregul pe 16-biti: • 6552010 = 1111 1111 1111 00002 = FFF016 = 1777608 • In C, numerele hexazecimale incep cu 0x si numerele octale incep cu 0: • x=65520; baza 10 • x=0xfff0; baza 16 (hex) • x=0177760; baza 8 (octal)
Operatii pe biti (2) Operatori pe biti: • Operatorul deplasare (shift): • x << n (la stinga) • Deplaseaza bitii cu n pozitii la stinga, punind zero in dreapta. • Daca x = 1111 1111 1111 00002 x << 1 este 1111 1111 1110 00002 • x >> n (la dreapta) • Deplaseaza bitii cu n pozitii la dreapta: • Punind 1 in partea stinga daca este un intreg cu semn • Punind 0 in partea stinga daca este un intreg fara semn • x >> 1 este 0111 1111 1111 10002 (fara semn) • x >> 1 este 1111 1111 1111 10002 (cu semn)
Operatii pe biti (3) • Operatori logici pe biti: • Se aplica tuturor tipurilor intregi: • &Şi pe biti x= 0xFFF0 1111 1111 1111 0000 y= 0x002F & 0000 0000 0010 1111 x&y= 0x0020 0000 0000 0010 0000 • |SAU pe biti x|y= 0xFFFF 1111 1111 1111 0000 | 0000 0000 0010 1111 1111 1111 1111 1111 • ^SAU EXCLUSIV pe biti x^y= 0xFFDF • ~COMPLEMENT pe biţi ~ y= 0xFFD0 • Inlocuieste fiecare bit 0 cu 1 şi fiecare bit 1 cu 0
Inmultire si Impartire cu 2 • Inmultirea si impartirea cu 2 este adesea mai lenta decit deplasarea pe biti. • Inmultirea cu 2 poate fi inlocuita cu deplasarea cu 1 bit la stinga: n = 10 printf(“%d = %d” , n*2, n<<1); printf(“%d = %d”, n*4, n<<2); …… • Impartirea cu 2 poate fi inlocuita cu deplasarea cu 1 bit la dreapta: n = 10 printf(“%d = %d” , n/2, n>>1); printf(“%d = %d”, n/4, n>>2);
Precedenta Operatorilor Operator Nivelul de precedenta ( ) 1 ~, ++, --, unar - 2 *, /, % 3 +, - 4 <<, >> 5 <, <=, >, >= 6 ==, != 7 & 8 ^ 9 | 10 && 11 || 12 =, +=, -=, etc. 14
Exemplu • Care este diferenta dintre cele doua linii de la iesire (output)? #include <stdio.h> int main () { int w=10,x=20,y=30,z=40; int temp1, temp2; temp1 = x * x /++y + z / y; printf ("temp1= %d;\nw= %d;\nx= %d;\ny= %d;\nz= %d\n", temp1, w,x,y,z); y=30; temp2 = x * x /y++ + z / y; printf ("temp2= %d;\nw= %d;\nx= %d;\ny= %d;\nz= %d\n", temp2, w,x,y,z); return 0; }
Operatorul Conditional • Forma generica: exp1 ? exp2 : exp3 daca exp1 este true (non-zero) valoarea este exp2 (exp3 nu este evaluata) daca exp1 este falsa (0), valoarea este exp3 (exp2 nu este evaluata) • Exemplu: z = (x > y) ? x : y; • Aceasta este echivalent cu: if (x > y) z = x; else z = y;
Funcţia printf (1) • Există o serie de specificatori de format pentru funcţia printf. Specificator Semnificatie %d tipăreşte argumentul de tip int în format zecimal %ldtipăreşte argumentul de tip long int în format zecimal %c tipăreşte un caracter %s tipăreşte un şir de caractere %f tipăreşte un argument de tip float sau double %e la fel ca %f, dar foloseşte notaţia exponenţială %g foloseşte %e sau %f, care e mai bun %o tipăreşte un argument de tip int în baza 8 %x tipăreşte un argument de tip int în baza 16 %% tipăreşte %
Funcţia printf (2) • Apelul: printf("%c %d %f %e %s %d%%\n", '1', 2, 3.14, 56000000., "opt", 9); va tipări: 1 2 3.140000 5.600000e+07 opt 9% • Apelul: printf("%d %o %x\n", 100, 100, 100); va tipări: 100 144 64 • Apeluri succesive ale funcţiei printf vor genera ieşirile una după alta, astfel apelurile de mai jos vor afişa Hello, world! (pe o singură linie): printf("Hello, "); printf("world!\n");
Funcţia printf (3) • Un exemplu de utilizare a functiei printf: #include <stdio.h> int main() { int ten=10,x=42; char ch1='o', ch2='f'; printf("%d%% %c%c %d is %f\n", ten,ch1,ch2,x, 1.0*x / ten ); return 0; }
Funcţia scanf (1) • Functia scanf esteasemanatoare cu printf: • Este o functie din biblioteca C: <stdio.h> • Specificatorii de format sunt aceeasi ca la functia printf • Exemple: scanf ("%d", &x); /* citeste un numar intreg */ scanf ("%f", &rate); /* citeste un numar real */ int n1, n2; float f; scanf("%d%d%f",&n1,&n2,&f); (Trebuie sa fie adaugate spatii pentru a separa numerele.) • Caracterul & este utilizat pentru adresa unei variabile
Funcţia scanf (2) Exemplu: int main() { int x; long y; float a; double b; scanf("%d %ld %f %lf", &x, &y, &a, &b); printf("%d %ld %f %lf", x, y, a, b); return 0; }