Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici Operatii pe biti Operatorul conditional Operatori Logici && si sau! negare (operator unar)!((a>1)&&(a<10)) ((a<-1)&&(a>-10)) Operatori logici pe biti Operatorii din această categorie acţionează asupra biţilor de pe aceeaşi poziţie din operanzi. Ei sunt: & - şi logic pe biţi - sau logic pe biţi ^ - sau exclusiv pe biţi ~ - complement faţă de unu >> - deplasare spre dreapta << - deplasare spre stanga Aceşti operatori se aplică la operanzi de tip întreg. & Şi pe biti SAU pe biti x= 0xFFF0 1111 1111 1111 0000 y= 0x002F & 0000 0000 0010 1111 x&y= 0x0020 0000 0000 0010 0000
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 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) Inmultire si Impartire cu 2 Inmultirea si impartirea cu 2 este adesea mai lenta decat 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); Operatorul Conditional Sintaxa: exp1? exp2 : exp3 exp2 Exemplu: z = (x > y)? x : y; max_a_b_c=a>b?(a>c?a:c):(b>c?b:c); daca exp1 este true (non-zero) valoarea este daca exp1 este falsa (0), valoarea este exp3
Tabelul de mai jos sintetizează regulile de pondere şi asociativitate pentru toţi operatorii. Operatorii de pe aceeaşi linie au aceeaşi pondere; liniile sunt în ordinea ponderii descrescătoare, astfel că, de exemplu, "*", "/" şi "%" au aceeaşi pondere, care este mai mare decât a operatorilor "+" şi "-". Tabela cu ordinea de precedenţă a operatorilor limbajului C este preluată din B.Kernigham, D. Ritchie, - The C Programming Language, 2 nd ed. OPERATORII Asociativitatea ( ) [ ] -->. de la stânga la dreapta! ~ ++ -- + - * de la dreapta la stânga & * (type) sizeof / % de la stânga la dreapta + - de la stânga la dreapta << >> de la stânga la dreapta < <= > >= de la stânga la dreapta ==!= de la stânga la dreapta & de la stânga la dreapta ^ de la stânga la dreapta de la stânga la dreapta && de la stânga la dreapta de la stânga la dreapta?: de la dreapta la stânga = += -= *= /= %= &= ^= de la dreapta la stânga =, de la stânga la dreapta
INSTRUCŢIUNILE LIMBAJULUI C Într-un program, indicarea prelucrărilor care urmează a fi realizate pentru rezolvarea unei probleme se face prin intermediul instrucţiunilor adresate calculatorului. Instrucţiunile sunt separate unele de altele prin caracterul punct şi virgulă (;) cu excepţia cazurilor în care sintaxa instrucţiunii specifică altfel. Ordinea în care se execută instrucţiunile unui program defineşte aşa numita structură de control a programului. Pentru exprimarea proceselor de calcul sunt definite şi necesare trei structuri de control: structura secvențială structura alternativă şi structura repetitivă condiţionată anterior. Limbajul C a fost prevăzut cu instrucţiuni menite să permită realizarea simplă a structurilor proprii programării structurate. Structura secvenţială se realizează cu ajutorul instrucţiunii compuse, structura alternativă cu ajutorul instrucţiunii if, structura repetitivă condiţionată anterior, prin
intermediul instrucţiunilor while şi for, structura selectivă se realizează cu ajutorul instrucţiunii switch, iar structura repetitivă condiţionată posterior cu ajutorul instrucţiunii do while. În afară de aceste instrucţiuni, limbajul C are şi alte instrucţiuni care reprezintă elemente de bază în construirea structurilor de mai sus şi anume: instrucţiunea expresie şi instrucţiunea vidă. Instrucţiunile return, break, continue şi goto sunt o categorie specială de instrucţiuni în C, ele asigurând o flexibilitate mare în programare. Instrucţiunea vidă Instrucţiunea vidă se reduce la caracterul punct şi virgulă (;). Ea nu are nici un efect. Instrucţiunea vidă se utilizează în construcţii în în cadrul structurii alternative şi repetitive. Instrucţiunea expresie Instrucţiunea expresie se obţine scriind punct şi virgulă după o expresie. Deci, ea are formatul: expresie; În cazul în care expresia din compunerea unei instrucţiuni expresie este expresie de atribuire, se spune că instrucţiunea respectivă este o instrucţiune de atribuire. Dacă expresia este un operand ce reprezintă apelul unei funcţii, instrucţiunea expresie este o instrucţiune de apel a funcţiei respective. Exemple: 1. int x; x=10; 2. double y; y = y + 4;
3. double a; a++; 4. int a,b,c; scanf( %d %d %d, &a,&b,&c); printf( suma=%d\t produsul=%d\n, a+b+c, a*b*c); Instrucţiunea compusă Instrucţiunea compusă este o succesiune de instrucţiuni incluse între acolade, succesiune care poate fi precedată şi de declaraţii: { // declaraţii // instrucţiuni Exemplu: Presupunem că într-un anumit punct al programului este necesar să se permute valorile variabilelor întregi a şi b. Aceasta se poate realiza astfel: { int t; *t = a; a = b; b = t; Instrucţiunea alternativă Instrucţiunea alternativă este instrucţiunea care corespunde structurii alternative din programarea structurată şi este reprezentată de instucţiunea if. Ea are următoarele
formate: if (expresie) instructiune; sau if (expresie) instructiune1; else instrucțiune2ș La întâlnirea instrucţiunii if întâi se evaluează expresia din paranteze. Apoi, în cazul formatului 1, dacă expresia are valoarea diferită de zero (adică are valoarea adevărat), se execută instrucţiune; altfel se trece în secvenţă la instrucţiunea următoare instrucţiunii if. In cazul formatului 2, dacă expresia are o valoare diferită de zero, atunci se execută instructiune1 şi apoi se trece la execuţia instrucţiunii următoare instrucţiunii if. Dacă expresia are o valoarea zero, atunci se execută instrucţiune2 şi apoi se trece la execuţia instrucţiunii următoare instrucţiunii if. Instrucţiunile din compunerea lui if pot fi instrucţiuni compuse, chiar instrucţiuni if. În acest caz se spune că instrucţiunile if sunt imbricate. Exemple: Ex. 1 Să se scrie un program care calculează şi afişează rădacina ecuaţiei de gradul I, ax+b=0. Valorile coeficienţilor a şi b se vor citi de la tastaură. #include <stdio.h> int main() { double a,b; printf( a= ); scanf( %lf, &a); printf( b= ); scanf( %lf,&b);
if( a!= 0) printf( a=%g\ tb=%g\ tx=%g\ n, a,b, -b/a); else if( b= =0) printf( ecuaţie nedeterminată\n ); else printf( ecuaţia nu are soluţie\n); return 0; Ex.2 Să se scrie un program care citeşte un număr întreg format din trei cifre de la tastatură, ordonează descrescător cifrele din care este alcătuit numărul şi formează şi afişează numărul cu cifrele ordonate descresător. #include <stdio.h> int main() { int c1,c2,c3,n,aux; printf(" n="); scanf("%3d",&n); aux=n; c1=aux%10; aux=aux/10; c2=aux%10; c3=aux/10; printf("cifrele = %d, %d, %d \n",c1,c2,c3); if (c2>c1) { aux=c2; c2=c1; c1=aux;
if (c3>c1) { aux=c3; c3=c1; c1=aux; if (c3>c2) { aux=c3; c3=c2; c2=aux; printf("cifrele ordonate = %d, %d, %d \n",c1,c2,c3); aux=c1*100+c2*10+c3; printf("nr = %d \n",aux); return 0;