Operatori in limbajul C

8
 Informatică clasa a X -a 1 Cap.4 Operatorii limbajului C O expresie este o succesiune de operatori şi operanzi legaţi între ei după reguli specifice limbajului: Operanzii pot fi - variabile sau constante - funcţii care furnizează un rezultat prin chiar numele lor (de exemplu funcţia sistem sqrt(x), care furnizează radical de ordinul 2 din x).  Operatorii sunt simboluri care determină executarea anumitor operaţii.  Limbajul C dispune de o gamă extinsă de operatori. Pe lângă setul de operatori uzuali, limbajul are definiţi operatori care oferă facilităţi asemănătoare limbajelor de asamblare. Există astfel operatori aritmetici, operatori de atribuire simplă sau compusă, operatori logici, operatori de prelucrare pe biţi etc.   În funcţie de rezultatul obţinut în urma evaluării, există: - Expresii matematice: rezultatul este un număr întreg sau real. - Expresii logice: rezultatul este 0 sau 1 care poate fi interpretat ca False sau True. - Expresii de tip text: rezultatul este un şir de caractere. - Expresii fără tip: care conţin apelul unei funcţii care nu furnizează nici un rezultat. 4.1 Precedenţa operatorilor  Precedenţa operatorilor determină ordinea de evaluare a operaţiilor dintr -o expresie. În funcţie de precedenţă, operatorii C sunt împărţiţi în 15 categorii prezentate în tabelul următor :  Categorie Operatori Semnificaţie 1. Prioritate maximă ( ) [ ] .  Apel de funcţie Expresie cu indici Selectori de membru la structuri 2. Operatori unari ! ~ + - ++ -- & * sizeof (tip) Negare logică Negare bit cu bit (complementare cu 1) Plus şi minus unari  Incrementare/decrementare (pre şi post) Obţinerea adresei/indirectare Dimensiune operand (în octeţi) Conversie explicită de tip - cast 3. Operatori de multiplicare * / %  Înmulţire/împărţire Restul împărţirii întregi 4. Adunare , scădere + - Plus şi minus binari  5. Deplasări << >> Deplasare stânga/dreapta pe biţi 6. Relaţionali < <= > >= Mai mic/mai mic sau egal Mai mare/mai mare sau egal 7. Egalitate == != Egal Diferit 8. & SI logic bit cu bit 9. ^ SAU EXCLUSIV bit cu bit 10. | SAU logic bit cu bit 11. && SI logic 12. || SAU logic 13. Op. condiţional ?: Operatorul condiţional (ternar) 14. Operatori de atribuire = *= /= %= += - = &= ^= |= <<= >>=  Atribuire simplă  Atribuire produs , cât , rest  Atribuire sumă , diferenţă  Atribuire SI , SAU EXCLUSIV , SAU (bit)  Atribuire cu deplasare stânga/dreapta 15. Virgula , Evaluare expresie1 , expresie2 . Valoarea rezultatului este expresie2. Cei din prima categorie au prioritatea maximă. Precedenţa descreşte cu cât creşte numărul categoriei din care face parte operatorul. Operatorii din aceeaşi categorie au acelaşi grad de precedenţă. Ordinea de evaluare a

description

sunt prezentati operatorii limbajului Ceste prezentata prioritatea operatorilor in limbajul Csunt prezentati operatorii relationali, logici, aritmetici

Transcript of Operatori in limbajul C

  • Informatic clasa a X-a

    1

    Cap.4 Operatorii limbajului C O expresie este o succesiune de operatori i operanzi legai ntre ei dup reguli specifice limbajului: Operanzii pot fi - variabile sau constante

    - funcii care furnizeaz un rezultat prin chiar numele lor (de exemplu funcia sistem sqrt(x), care furnizeaz radical de ordinul 2 din x).

    Operatorii sunt simboluri care determin executarea anumitor operaii. Limbajul C dispune de o gam extins de operatori. Pe lng setul de operatori uzuali, limbajul are definii operatori care ofer faciliti asemntoare limbajelor de asamblare. Exist astfel operatori aritmetici, operatori de atribuire simpl sau compus, operatori logici, operatori de prelucrare pe bii etc. n funcie de rezultatul obinut n urma evalurii, exist: - Expresii matematice: rezultatul este un numr ntreg sau real. - Expresii logice: rezultatul este 0 sau 1 care poate fi interpretat ca False sau True. - Expresii de tip text: rezultatul este un ir de caractere. - Expresii fr tip: care conin apelul unei funcii care nu furnizeaz nici un rezultat.

    4.1 Precedena operatorilor

    Precedena operatorilor determin ordinea de evaluare a operaiilor dintr-o expresie. n funcie de preceden, operatorii C sunt mprii n 15 categorii prezentate n tabelul urmtor :

    Categorie Operatori Semnificaie 1. Prioritate maxim ( )

    [ ] .

    Apel de funcie Expresie cu indici Selectori de membru la structuri

    2. Operatori unari ! ~ + - ++ -- & * sizeof (tip)

    Negare logic Negare bit cu bit (complementare cu 1) Plus i minus unari Incrementare/decrementare (pre i post) Obinerea adresei/indirectare Dimensiune operand (n octei) Conversie explicit de tip - cast

    3. Operatori de multiplicare

    * / %

    nmulire/mprire Restul mpririi ntregi

    4. Adunare , scdere + - Plus i minus binari 5. Deplasri > Deplasare stnga/dreapta pe bii 6. Relaionali < >= Mai mic/mai mic sau egal Mai mare/mai mare sau egal

    7. Egalitate == !=

    Egal Diferit

    8. & SI logic bit cu bit

    9. ^ SAU EXCLUSIV bit cu bit

    10. | SAU logic bit cu bit

    11. && SI logic

    12. || SAU logic

    13. Op. condiional ?: Operatorul condiional (ternar) 14. Operatori de atribuire

    = *= /= %= += - = &= ^= |= =

    Atribuire simpl Atribuire produs , ct , rest Atribuire sum , diferen Atribuire SI , SAU EXCLUSIV , SAU (bit) Atribuire cu deplasare stnga/dreapta

    15. Virgula , Evaluare expresie1 , expresie2 . Valoarea rezultatului este expresie2.

    Cei din prima categorie au prioritatea maxim. Precedena descrete cu ct crete numrul categoriei din

    care face parte operatorul. Operatorii din aceeai categorie au acelai grad de preceden. Ordinea de evaluare a

  • Informatic clasa a X-a

    2

    operaiilor este de la stnga la dreapta, cu excepia operatorilor unari (categoria 2), a operatorului condiional (categoria 13) i a operatorilor de atribuire (categoria 14) care au ordinea de evaluare de la dreapta la stnga.

    Totui ordinea de efectuare a operaiilor nu este ntotdeauna perfect determinat. Se poate face o reorganizare a expresiilor pentru a obine un cod mai eficient, dar ordinea de efectuare a operaiilor nu este strict definit. n funcie de context, acelai operator poate avea semnificaii diferite. Spre exemplu operatorul & (ampersand) poate fi considerat ca :

    - operatorul binar SI pe bii (a & b) - operatorul unar, adresa unui operand (&a)

    Semnificaia depinde de numrul de argumente folosite, unul sau dou .

    4.2 Operatorul de atribuire simpl

    Acest operator (=) realizeaz memorarea valorii unei expresii ntr-o variabil. Are sintaxa :

    variabila=expresie; Efectul este stocarea valorii expresiei din membrul drept la adresa variabilei scrise n membrul stng. Exemplul 1: char c; int i,k; float x;

    c=a;

    i=3;

    k=d; /* k=100 ; d de tip caracter este convertit la un tip ntreg */

    x=c+i; /* x=100 ;se face conversie la un tip ntreg : 97+3=100 */

    n plus, atribuirea nsi are o valoare, i anume valoarea variabilei din stnga dup memorarea coninutului valorii expresiei. Datorit acestui efect, rezult n final o valoare a expresiei de atribuire care poate fi folosit direct ntr-o alt atribuire. De aceea este permis atribuirea multipl. Exemplul 2 : int i,j,k ;

    i=j=k=1;

    care este echivalent cu secvena : k=1; j=k; i=j;

    Se observ o mai bun compactare a codului surs n primul caz, de folosire a atribuirii multiple. Toate cele trei variabile au dup atribuire valoarea 1. Exemplul 3: int i,j,k;

    j+1=i;

    i=1+j=k;

    Ambele instruciuni de atribuire sunt incorecte, pentru c j+1 nu este o variabil. Exemplul 4: Considerm instruciunile: b=2;

    c=3;

    a=b+c;

    unde toate variabilele sunt de tipul int. Folosind faptul c = este un operator, putem condensa la: a=(b=2)+(c=3);

    Explicaia este c expresia de asignare b=2 atribuie valoarea 2 att variabilei c, ct i instruciunii ntregi.

    4.3 Operatori aritmetici

    Operatorii aritmetici din C pot folosi, mai puin operatorul modulo care poate lucra numai cu numere ntregi, att numere ntregi ct i numere reale. Exemplul 1 : Folosirea operatorilor aritmetici . int i,j,n;

    float x;

    n=10*4-7; /* n=33 */

    i=9/2; /* i=4 ca rezultatul mpririi a dou numere ntregi */

    j=n%i; /* j=1 ca restul mpririi a dou numere ntregi */

    x=n; /* x=33.00 - ca numr real*/

    x=x%i; /* se obine eroare operatorul % fiind definit numai pt. numere ntregi*/

    Exemplul 2 : La acelai rezultat conteaz tipul variabilei din stnga . int i;

    float x;

    i=7./2; /* i=3 pentru c 3.5 real este convertit la tipul ntreg al lui i */

    X=7./2; /* x=3.5 pentru c x este de tip real */

    n concluzie, rezultatul este convertit la tipul variabilei din membrul stng al atribuirii. Exemplul 3: n operaiile cu constante conteaz dac ele sunt de tip ntreg sau real.

  • Informatic clasa a X-a

    3

    int i,j;

    i=5/2+7/2;

    /* rezultatele mpririi dintre dou numere ntregi sunt

    convertite tot la numere ntregi i i=2+3=5 */

    j=5./2+7/2.;

    /* rezultatele mpririi dintre un numr real i un

    numr ntreg sunt numere reale,2.5+3.5=6.0 ,deci j=6 */

    Spre deosebire de ceilali operatori aritmetici, operatorii de incrementare i decrementare sunt specifici limbajelor de asamblare. Ei sunt mult mai rapizi, efectul lor constnd n mrirea/micorarea variabilei cu 1 n modul urmtor :

    - ++var sau var++ : variabila var este mrit cu o unitate, n primul caz, nainte de utilizarea ei (preincrementare), iar n al doilea caz, dup utilizarea ei (postincrementare )

    - --var sau var-- : variabila var este micorat cu o unitate, n primul caz, nainte de utilizarea ei (predecrementare), iar n al doilea caz, dup utilizarea ei (postdecrementare)

    Are importan dac operatorii de incrementare i decrementare se folosesc la stnga sau la dreapta variabilei. Exemplul 4: int i,j=7;

    i=j++; /* i=7 , j=8 */

    sau i=++j; /* i=8 , j=8 */

    Exemplul 5: int a=2,b=3,c,d;

    c=d=(a++ +1)b--; /* a=3 , b=2 , d=0 , c=0 */

    Exemplul 6: Fie declaraiile i iniializrile: int a=1,b=2,c=3,d=4;

    Atunci avem: Expresie Expresie echivalenta parantezata Valoare

    a*b/c (a*b)/c 0

    a*b%c+1 ((a*b)%c)+1 3

    ++a*b-c-- ((++a)*b)-(c--) 1

    7 - -b*++d 7-((-b)*(++d)) 17

    4.4 Operatorii relaionali

    Operatorii relaionali (categoriile 6 i 7) pot fi folosii pentru date de tip aritmetic i pointeri. Rezultatul este 0

    dac relaia nu este ndeplinit i 1 dac este ndeplinit. Exemplul 1 : int egal,x,y;

    x=17;

    y=2*x-1;

    egal=x==y; /* egal=0 */

    Exemplul 2: Presupunemn c avem declaraiile:

    int i=1,j=2,k=3;

    double x=5.5,y=7.7;

    Atunci : Exemplul 3: Presupunem c avem declaraiile:

    int i=1,j=2,k=3;

    Atunci :

    4.5 Operatori logici

    Cum n limbajul C nu exist tipul boolean, operatorii logici admit operanzi de orice tip scalar (simplu) pe care i interpreteaz conform comparaiei cu 0. Dac valoarea este 0, expresia este considerat fals, iar dac valoarea este nenul, expresia se consider adevrat. Rezultatul unei expresii logice este de tip ntreg i se bazeaz pe conveniile : adevrat=1 , fals=0.

    Expresie Expresie echivalenta Valoare

    i=(k+1) 1

    x-y

  • Informatic clasa a X-a

    4

    Tabela de adevr a operatorilor logici x y x && y x || y !x

    0 0 0 0 1

    0 !=0 0 1 1

    !=0 0 0 1 0

    !=0 !=0 1 1 0

    Exemplul 1: Dou forme echivalente pentru verificarea egalitii lui x cu 0.

    x==0 sau !x

    Exemplul 2 : Mai multe variante de verificare a condiiei ca x i y s fie ambii 0. a) x==0 && y==0 b) !x && !y c) !(x!=0||y!=0) d) !(x||y)

    Exemplul 3: Presupunem c avem declaraiile:

    int i=7,j=7;

    double x=0.0,y=999.9;

    Atunci: Exemplul 4: Presupunem c avem declaraiile:

    int i=3,j=3,k=3;

    double x=0.0,y=2.3;

    Atunci:

    4.6 Operatorii la nivel de bit

    Posibilitatea utilizrii operatorilor pe bii ofer limbajului C faciliti asemntoare cu cele ale limbajelor de asamblare. Operanzii pot fi numai tipuri ntregi . Fie biii b1 i b2. Rezultatul aplicrii operatorilor pe bii este :

    Operatori pe bii b1 b2 b1 & b2 b1 ^ b2 b1 | b2 ~ b1

    0 0 0 0 0 1

    0 1 0 1 1 1

    1 0 0 1 1 0

    1 1 1 0 1 0

    Operatorul & este i logic, | este sau logic, ^ este sau exclusiv ( rezultatul este 1 doar cnd biii sunt diferii).

    Operatorul ~ se numete operator de complement pe bit. Acesta inverseaz reprezentarea irului de bii, adic 0 devine 1 i 1 devine 0.

    Exemplu: Fie declaraia: int a=1571;

    //nr.ntreg cu semn reprezentatat, de exemplu, pe 2 octei

    Reprezentarea intern binar a lui a pe 2 octei este 00010100 00110011

    Expresia ~a este: 11101011 11001100

    Aceasta are valoarea ntreag -5172.

    Observaie: Reamintim n continuare cum se calculeaz valoarea unui numr pozitiv, respectiv negativ (n memoria

    calculatorului). Fie declaraia int a;

    Considerm reprezentarea sa intern binar pe 2 octei: Dac b15=0 (numr pozitiv), atunci valoarea lui a se calculeaz cu formula:

    14

    0

    2j

    j

    jba

    Expresie Expresie echivalenta Valoare

    !(i-j)+1 (!(i-j))+1 2

    !i-j+1 ((!i)-j)+1 -6

    !!(x+3.3) !(!(x+3.3)) 1

    !x*!!y (!x)*(!(!y)) 1

    Expresie Expresie echivalenta Valoare

    i&&j&&k (i&&j)&&k 1

    x||i&&j-3 x||(i&&(j-3)) 0

    i

  • Informatic clasa a X-a

    5

    Dac b15=1, considerm reprezentarea n baza 2 a complementului lui a (~a): unde tj=1-bj (bitul complementat). n acest caz, regulile de calcul sunt:

    14

    0

    2~j

    j

    jba -a=~a+1 deci a=-(~a+1)

    Complementul fa de 2 ale lui 0 i 1 sunt speciale: valoarea 0 are toi biii 0, pe cnd valoarea 1 are toi biii 1. Observaie: Dac maina pe care lucrai reprezint tipul int ca long int pe 4 octei, raionamentul se aplic identic pe 32 de bii.

    Operatorii , sunt numii operatori de deplasare pe bii la stnga, respectiv la dreapta. Ei au sintaxa :

    an /* echivalent cu ctul mpririi lui a la 2n */

    Exemplul 1: int t=1,j=6,k,n;

    t=12; /* k=26/2

    2=2

    4 */

    n=t&k;

    /* n=0 pentru c t i k nu au nici un bit de pe aceeai poziie egal cu 1 */ Exemplul 2: Fie declaraia char c=Z;

    Expresie Reprezentare Actiune

    c 01011010 nedeplasat

    c

  • Informatic clasa a X-a

    6

    Expresie Reprezentare Valoare

    a 00001101 00000101 3333

    b 00011110 01100001 7777

    a & b 00001100 00000001 3073

    a ^ b 00010011 01100100 4964

    a | b 00011111 01100101 8037

    ~(a | b) 11100000 10011010 -8038

    (~a & ~b) 11100000 10011010 -8038

    Exemplul 6: Operatorii | i & pot fi folosii pentru a seta(face 1) sau terge (face 0) anumite cmpuri de bii.

    (k&1j ; /* determin valoarea bitului de pe poziia j */

    k=k&~(1

  • Informatic clasa a X-a

    7

    k^=j^=k^=j;

    Exemplul 5 : Folosirea operatorului I pe bii . long k;

    k&=~k; /* k=0 , indiferent de valoarea sa iniial */

    Exemplul 6 : unsigned short k;

    short j;

    k|=~k; /* k=216-1=65535 , indiferent de valoarea sa anterioar */

    j|=~j; /* dac j este cu semn, atunci valoarea sa devine 1 */

    Exemplul 7: int k;

    k^=k; /* k=0 , indiferent de valoarea sa anterioar */

    Exemplul 8: int k=-25;

    k

  • Informatic clasa a X-a

    8

    4.10 Operatorii de adresare

    Se utilizeaz pentru obinerea adresei unui element sau pentru obinerea coninutului de la o anumit adres. Cazurile tipice n care sunt folosii sunt :

    - accesul la cmpurile unei structuri sau ale unei uniuni - memorarea adresei unui element - accesul indirect la un element - accesul la un element al unui tablou

    Operatorii de adresare sunt : [ ] indexare . selecie direct selecie indirect & determinare adres * adresare indirect

    4.11 Operatorul condiional

    Este un operator cu trei operanzi. Se folosete pentru situaiile n care exist dou variante de obinere a rezultatului, n funcie de ndeplinirea unei condiii. Are sintaxa : expr_cond ? rezultat_1 : rezultat_2; Semnificaia este : daca expr_cond atunci rezultat=rezultat_1 altfel rezultat=rezultat_2 Exemplul 1:

    double max,a,b;

    max=(a>b)?a:b; /* se determin maximul a dou numere */

    Exemplul 2: unsigned k;

    k?cout