Sunteți pe pagina 1din 6

Operatori

Limbajul C conine foarte muli operatori. De fapt, el acord acestora o importan mai mare dect majoritatea limbajelor. Exist patru clase de operatori: aritmetici, relaionali, logici i de aciune la nivel de bit. Operatorul de atribuire Forma general a operaiei de atribuire este urmtoarea: idetificator_ de_variabila = expresie; unde idetificator_ de_variabila poate fi o variabil sau un pointer, nu o funcie sau o constant, iar expresie poate fi o constant sau o expresie orict de complex. Conversii de tip Cnd variabilele din expresie sunt de tipuri diferite, are loc o conversie de tip, dup regula: valoarea expresiei este convertit la valoarea variabilei din membrul stng. De exemplu, n cazul seciunii int k; char ch; float f; void func(void) { ch=k; /* k=f; /* f=ch; /* f=k; /* }

caz caz caz caz

1*/ 2*/ 3*/ 4*/

au loc urmtoarele conversii de tip: n cazul 1, cei opt biii din stnga (de ordin mai mare) sunt eliminai i se atribuie lui ch cei opt bii de ordin mai mic. Dac x este cuprins ntre 0 i 255, ch i k vor avea valori identice. n cazul 2, k va primi partea ntreag a lui f. n cazul 3, valoarea coninut de cei opt bii ai lui ch este convertit n virgul mobil. n cazul 4, valoarea ntreag a lui k este convertit n virgul mobil. Cnd se convertete un ntreg ntr-un caracter, se pierd primii 8 bii, iar cnd se convertete un ntreg lung ntr-un ntreg, se pierd primii 16 bii. Atribuiri multiple n C, se poate atribui aceeai valoare mai multor variabile. De exemplu, valoarea 1 se poate atribui variabilelor i, j, k astfel: i = j = k = 1; 13

Expresia se evalueaz de la dreapta la stnga, efectul fiind echivalent cu al secvenei: k = 1; j = k; i = j; Rezumnd, forma general a instruciunii de atribuire este urmtoarea: idetificator_ de_variabila = expresie_atribuire; Operatori aritmetici Operatorii aritmetici pot fi unari sau binari. Majoritatea se regsesc n alte limbaje i sunt dai n tabelele urmtoare: Operatori unari + -++ Aciune minus plus Decrementare Incrementare Exemple -x +x k-- sau --k k++ sau ++k Exemple a-b a+b a*b a/b a%b

Operatori binari + * / %

Aciune Scdere Adunare nmulire mprire Restul mpririi ntregi

Operatorii unari de incrementare i decrementare nu se regsesc n alte limbaje. Acetia adun, respectiv, scad valoarea 1 la variabila operat. De exemplu, expresiile: k = k+1; j = j-1; pot fi scise i, respectiv, astfel: ++k; /* sau k++; */ --j; /* sau j++; */ n legtur cu efectul operatorilor de incrementare i decrementare, exist totui o diferen ntre forma cu prefix i cea cu sufix. Astfel: ++variabila, sau variabila, modific valoarea variabilei nainte ca aceasta s fie utilizat n expresie, iar variabila++, sau variabila, modific valoarea variabilei dup ca aceasta a fost utilizat n expresie. De exemplu, expresia: y = x++;

14

este echivalent cu expresiile: y = x; x = x+1; adic, pentru x=10, dup execuie se obin valorile y=10 i x=11, iar expresia: y = ++x; este echivalent cu expresiile: x = x+1; y = x; adic, pentru x=10, dup execuie se obin valorile x=11 i y=11. n expresii, ordinea de efectuare a operaiilor aritmetice este urmtoarea: De nivel cel mai nalt De nivel cel mai cobort ++ + * + -/ (unari) % (binari)

Operatorii cu aceeai preceden sun evaluai de la stnga la dreapta. Cu ajutorul parantezelor rotunde, se poate modifica ordinea efecturii operaiilor. Operatori relaionali i logici Operatorii relaionali se refer la relaiile dintre dou valori aritmetice sau de tip pointer. Acetia sunt dai n urmtorul tabel: Operatori relaionali > < >= <= == != Aciune mai mare mai mic mai mare sau egal mai mic sau egal egal diferit Exemple a>b a<b a>=b a<=b a==b a!=b

Operatorii logici se refer la modul n care sunt corelate dou relaii. Acetia sunt dai n urmtorul tabel: Operatori logici && || ! Aciune AND (I) OR (SAU) NOT (NEGARE) Exemple a>0 && b>0 a<0 || b<0 !( a<0 || b<0)

Funcia SAU-EXCLUSIV, adic XOR, este dat de relaia: a XOR b = (a||b) && !(a&&b) 15

n C, nu exist tipul de date logic (adevrat/fals). Operatorii logici admit operanzi de tip scalar, care sunt tratai dupa convania: fals = 0, iar adevrat = orice valoare diferit de 0. Rezultatul unei operaii relaionale sau logice este de tipul int i se bazeaz pe convenia: - adevrat = 1; - fals = 0. De exemplu, secvena de mai jos va afia cifra 1. int k; k=120; printf(%d, k>1); Pentru operatorii logici, tabela de adevr este urmtoarea: a 0 0 1 1 b 0 1 1 0 a&&b 0 0 1 0 a||b 0 1 1 1 !a 1 1 0 0

Operatorii relaionali i logici au preceden mai sczut dect cei aritmetici. n expresii, ordinea de efectuare a operaiilor relaionale i logice este urmtoarea: De nivel cel mai nalt ! > == && || < != >= <=

De nivel cel mai cobort

Cu ajutorul parantezelor rotunde, se poate modifica ordinea efecturii operaiilor. Operatori la nivel de bit Operaiile la nivel de bit se refer la testare, iniializare sau deplasarea biilor dintr-un octet sau cuvnt, n cazul tipului char, respectiv int, precum i tipurilor ce deriv din acestea. Operaiile la nivel de bit nu se pot aplica tipurilor float, double, long double i void. n tabelul de mai jos, sunt dai operatorii la nivel de bit. Operator & | ^ ~ >> << Aciune AND OR XOR NOT (negare) Deplasare la dreapta Deplasare la stnga

Operatorul de negare este unar, iar ceilali sunt toi binari. Operanzii sunt toi de tip ntreg. Pentru o pereche de bii a i b operaiile sunt descries n tabelul de mai jos. 16

a 0 0 1 1

b 0 1 1 0

a&b 0 0 1 0

a|b 0 1 1 1

a^b 0 1 1 0

~a 1 1 0 0

Pentru ilustrarea utilizrii operatorilor logici la nivel de bit, n exemplul urmtor, sunt propuse cteva operaii simple: trecerea de la codul ASCII al unei litere mici la codul literei mari, prin anularea bitului 5; o conversie de la o cifra la codul ASCII al caracterului corespunztor cifrei respective. char i=0x62; /* b=0x62* / char j=9,k; i=i&0x5f; /* i rezulta 0x42, adica B=0x42 */ k=j|0x30; /* j=9, k rezulta 0x39, adica 9=0x39 */ n primul caz, plecnd de la i = b, se obine i = B: i = 0110 0010 = 0x62 & 0x5f = 0101 1111 -------------------------------------------= i = 0100 0010 = 0x42 = B n al doilea caz, plecnd de la j= 9, se obine k = 9: j = 0000 1001= 0x09 | 0x30 = 0011 0000 -------------------------------------------= k = 0011 1001 =0x39 = 9 Observaie: Rezultatul operaiilor relaionale i logice este ntotdeauna 0 sau 1. Rezultatul unei operaii pe bii poate s conduc i la alte valori, diferite de 0 i 1. Operaiile de deplasare pentru bii, >> i <<, deplaseaz toi biii dintr-o variabil la dreapta sau la stnga, dup cum se specific. Forma general a instruciunii de deplasare la dreapta este: variabil >> numr_pozii_bii; iar forma general a instruciunii de deplasare la stnga este: variabil << numr_pozii_bii; Deoarece biii sunt mutai ctre un capt, la cellalt capt se adaug zerouri (n cazul unui ntreg negativ, cu semn, o deplasare la stnga va determina introducerea unui 1, astfel nct bitul de semn se va pstra).

17

Observaii: 1. 2. Fiecare deplasare la snga determin o nmulire cu 2, iar fiecare deplasare la dreapta determin o mprire cu 2. La deplasare, se poate pierde din informaie cnd biii unitari depesc marginea. Aceste observaii sunt evidente, n cazul urmtorului exemplu: Operaii cu unsigned char x x=7; x=x<<1; x=x<<3; x=x<<2; x=x>>1; x=x>>2 Cod x 00000111 00001110 01110000 11000000 01100000 00011000 Operatori de atribuire combinai Operatorul de atribuire poate fi combinat cu o serie de operatori aritmetici i operatori la nivel de bit, rezultnd enunuri prescurtate. n caz general, expresia: variabil = variabil operator expresie; se poate scrie: variabil operator = expresie; Exist zece combinaii posibile: += &= -= |= *= ^= /= >>= %= <<= Valoare x 7 14 112 192 96 24

De exemplu, expresiile: a=a+b a=a*b a=a>>b a=a&b

sunt, respective, echivalente cu expresiile: a+=b a*=b a>>=b a&=b

18

S-ar putea să vă placă și