Documente Academic
Documente Profesional
Documente Cultură
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; /* }
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 + * / %
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 ! > == && || < != >= <=
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
18