Documente Academic
Documente Profesional
Documente Cultură
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 din x!" Operatorii sunt simboluri care determin executarea anumitor operaii" #imbajul $ dispune de o gam extins de operatori" %e l&ng setul de operatori uzuali' limbajul are definii operatori care ofer faciliti asemntoare limbajelor de asamblare" (xist 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 * sau + care poate fi interpretat ca ,alse sau -rue" - Expresii de tip text: rezultatul este un ir de caractere" - Expresii fr tip: care conin apelul unei funcii care nu furnizeaz nici un rezultat"
5" Operatori de multiplicare 7" /dunare ' scdere ." 4eplasri 8" 6elaionali :" (galitate ;" <" +*" ++" + " +5" Op" condiional +7" Operatori de atribuire
+." ?irgula
$ei din prima categorie au prioritatea maxim" %recedena descrete cu c&t crete numrul categoriei din care face parte operatorul" Operatorii din aceeai categorie au acelai grad de preceden" Ordinea de evaluare a operaiilor este de la st&nga la dreapta' cu excepia operatorilor unari (categoria !' a operatorului condiional (categoria +5! i a operatorilor de atribuire (categoria +7! care au ordinea de evaluare de la dreapta la st&nga"
Informatic clasa a X-a -otui ordinea de efectuare a operaiilor nu este ntotdeauna perfect determinat" 0e 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" 0pre exemplu operatorul * (ampersand! poate fi considerat ca : - operatorul binar 02 pe bii (a * b! - operatorul unar' adresa unui operand (*a!
0emnificaia depinde de numrul de argumente folosite' unul sau dou " 4.5 Operatorul de atribuire simpl
/cest operator (1! realizeaz memorarea valorii unei expresii ntr-o variabil" /re sintaxa : 6ariabila1expresie7 (fectul este stocarea valorii expresiei din membrul drept la adresa variabilei scrise n membrul st&ng" 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 !=100 */ )n plus' atribuirea nsi are o valoare' i anume valoarea variabilei din st&nga dup memorarea coninutului valorii expresiei" 4atorit acestui efect' rezult n final o valoare a expresiei de atribuire care poate fi folosit direct ntr-o alt atribuire" 4e 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; 0e observ o mai bun compactare a codului surs n primul caz' de folosire a atribuirii multiple" -oate cele trei variabile au dup atribuire valoarea +" Exemplul 3: int i,j,k; j+1=i; i=1+j=k; /mbele instruciuni de atribuire sunt incorecte' pentru c j(1 nu este o variabil" Exemplul 4: $onsiderm instruciunile: b=2; c=3; a=b+c; unde toate variabilele sunt de tipul i!t" ,olosind faptul c 1 este un operator' putem condensa la: a=(b=2)+(c=3); (xplicaia este c expresia de asignare b15 atribuie valoarea at&t variabilei c' c&t i instruciunii ntregi"
/* re#ultatele $p%r&irii dintre dou% nu$ere ntregi sunt convertite tot la nu$ere ntregi -i i=. !=, */ j=%#!2+7!2#; /* re#ultatele $p%r&irii dintre un nu$%r real -i un nu$%r ntreg sunt nu$ere reale/.(, !(,=0(0 /deci '=0 */ 0pre deosebire de ceilali operatori aritmetici' operatorii de incrementare i decrementare sunt specifici limbajelor de asamblare" (i sunt mult mai rapizi' efectul lor const&nd n mrirea3micorarea variabilei cu + n modul urmtor : - ((6ar sau 6ar(( : variabila var este mrit cu o unitate' n primul caz' nainte de utilizarea ei (prei!creme!tare!' iar n al doilea caz' dup utilizarea ei (posti!creme!tare ! - ))6ar sau 6ar)) : variabila var este micorat cu o unitate' n primul caz' nainte de utilizarea ei (predecreme!tare!' iar n al doilea caz' dup utilizarea ei (postdecreme!tare! /re importan dac operatorii de incrementare i decrementare se folosesc la st&nga sau la dreapta variabilei" Exemplul 4: int i,j=7; i=j++; /* i=7 / '=1 @3 sau i=++j; /* i=1 / '=1 */ Exemplul 5: int a=2,b=3,c,d; c=d=(a++ +1)&b--; /* a=! / *=. / d=0 / c=0 */ Exemplul 6: ,ie declaraiile i iniializrile: int a=1,b=2,c=3,d=4; /tunci avem: 'x(r)*i) 'x(r)*i) )chi+al)nta (arant),ata -aloar) 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
-aloar) 0 1 1 0
int i=1,j=2,k=3; do0bl) x=%#%,/=7#7; :tu!ci : Exemplul 3: %resupunem c avem declaraiile: int i=1,j=2,k=3;
-aloar) 0 1 1
/tunci :
$um n limbajul $ nu exist tipul boolean' operatorii logici admit operanzi de orice tip scalar (simplu! pe care i interpreteaz conform comparaiei cu *" 4ac valoarea este *' expresia este considerat fals' iar dac valoarea este nenul' expresia se consider adevrat" 6ezultatul unei expresii logice este de tip ntreg i se bazeaz pe conveniile : adevratA+ ' falsA*" <abela de ade6r a operatorilor logici x ** = x 33 = > > > 1 > 1 1 1
Exemplul 1: 4ou forme echivalente pentru verificarea egalitii lui x cu *" x==0 sau 3x Exemplul 2 : 9ai multe variante de verificare a condiiei ca x i B s fie ambii *" a) x==0 44 /==0 b) 3x 44 3/ c) 3(x3=055/3=0) d) 3(x55/) 'x(r)*i) 3(i-j)+1 3i-j+1 33(x+3#3) 3x*33/ Exemplul 3: %resupunem c avem declaraiile: int i=7,j=7; do0bl) x=0#0,/= # ; /tunci: Exemplul 4: %resupunem c avem declaraiile: 'x(r)*i) )chi+al)nta (3(i-j))+1 ((3i)-j)+1 3(3(x+3#3)) (3x)*(3(3/)) -aloar) 2 -6 1 1
-aloar) 1 0 0 1
Operatorul C este i logic' D este sau logic' E este sau exclusiv ( rezultatul este + doar c&nd biii sunt diferii!" Operatorul F se numete operator de complement pe bit" /cesta inverseaz reprezentarea irului de bii' adic * devine + i + devine *" Exemplu: ,ie declaraia: int a=1%71; //nr(ntreg cu se$n repre#entatat/ de exe$plu/ pe . octe&i
6eprezentarea intern binar a lui a pe octei este 00010100 00110011 (xpresia 'a este: 11101011 11001100 /ceasta are valoarea ntreag -%172" Observa ie: 6eamintim n continuare cum se calculeaz valoarea unui numr pozitiv' respectiv negativ (n memoria calculatorului!" ,ie declaraia int a; $onsiderm reprezentarea sa intern binar pe octei: b1; b14 b1 b> 4ac b1;1> (numr pozitiv!' atunci valoarea lui a se calculeaz cu formula:
a = b j 2 j
j =0
14
reprezentarea
baza
~ a = bj 2 j
j =0
14
-a=7a+1
d)ci
a=-(7a+1)
$omplementul fa de ale lui * i G+ sunt speciale: valoarea * are toi biii *' pe c&nd valoarea G+ are toi biii +" Observa ie: 4ac maina pe care lucrai reprezint tipul i!t ca lo!g i!t pe 7 octei' raionamentul se aplic identic pe 5 de bii" Operatorii //' respectiv 00' sunt numii operatori de deplasare pe bii la st&nga' respectiv la dreapta" (i au sintaxa : a11n 3@ echivalent cu nmulirea lui a cu 5! @3 a22n 3@ echivalent cu c&tul mpririi lui a la 5! @3 Exemplul 1: int t=1,j=6,k,n; t=111j; 3@ tA+@ 8 @3 k=t222; 3@ HA 83 A 7 @3 n=t4k; 3@ nA* pentru c t i H nu au nici un bit de pe aceeai poziie egal cu + @3 Exemplul 2: ,ie declaraia char c=8; Expresie c c//1 c//4 c//1; Aepre,e!tare >1>11>1> 1>11>1>> 1>1>>>>> >>>>>>>> :ctiu!e nedeplasat deplasare la stanga cu + deplasare la stanga cu 7 deplasare la stanga cu +.
$hiar dac valoarea lui IcJ se memoreaz pe un octet' ntr-o expresie aceasta ia tipul I i!tJ" 4eci valoarea expresiilor Ic//1J' Kc//4J i Kc//1;J se memoreaz pe octei" Operatorul de deplasare la dreapta K00J nu este chiar simetric cu K//J" %entru expresiile integrale fr semn' din st&nga se va deplasa *' iar pentru cele cu semn +" %resupunem c avem declaraiile: int a=1111%; //intreg cu se$n 0n*i.n)d b=1111%; //intreg fara se$n Expresie a a008 b b008 Aepre,e!tare 1>>>>>>> >>>>>>>> 1111>>>> >>>>>>>> 1>>>>>>> >>>>>>>> >>>1>>>> >>>>>>>> :ctiu!e nedeplasat deplasare la dreapta cu 5 nedeplasat deplasare la dreapta cu 5
$a valoare zecimal' a008 este B4>C?' iar b008 este 4>C?' lucru care este n concordan cu noiunea de numr negativ i pozitiv din matematic" Observa ie:
4ac operandul din dreapta a operatorului de deplasare este negativ sau are o valoare care este egal sau depete numrul de bii folosii pentru reprezentarea intern a operandului din st&nga' atunci comportarea este nedefinit" Exemplul 3: -abelul de mai jos ilustreaz regulile de preceden (L este mai prioritar! i asociativitatea (de la st&nga la dreapta! referitoare la operatorii de deplasare" %resupunem c avem declaraiile 0n*i.n)d a=1,b=2; Expresie a//b001 a//1(5//8 a(b//15+a00b Expresie ecDi6ale!t (a//b)001 (a//(1(5))//8 ((a(b)//(15+a))00b Aepre,e!tare >>>>>>>> >>>>>>1> >>>>>>>> >1>>>>>> >>>>11>> >>>>>>>> Ealoare 5 ?4 8>F5
Exemplul 4: ,ie constanta >u' o constant ntreag (valoarea *! de tip unsigned care se reprezint pe +8 bii' deci este practic reprezentat ca +8 de *" Operaia '(>u) neag cei +8 bii de * care vor lua valoarea +' deci se va obine valoarea 51?)11?;;8;" Exemplul 5: %resupunem c avem declaraiile i iniializrile: int a=3333,b=7777; 'x(r)*i) a b a 4 b a : b a 5 b 7(a 5 b) (7a 4 7b) 9)(r),)ntar) 00001101 00000101 00011110 01100001 00001100 00000001 00010011 01100100 00011111 01100101 11100000 10011010 11100000 10011010 -aloar) 3333 7777 3073 4 64 ;037 -;03; -;03;
Exemplul 6: Operatorii 3 i * pot fi folosii pentru a seta(face +! sau terge (face *! anumite c&mpuri de bii" (k4111j)22j ; 3@ determin valoarea bitului de pe poziia j @3 k=k47(111j); 3@ seteaz bitul de pe poziia j la * @3 k=k5111j; 3@ seteaz bitul de pe poziia j la + @3 k=k:111j; 3@ complementeaz bitul de pe poziia j @3 Exemplul !: %rogramul determin numrul format prin extragerea a ! bii consecutivi dintr-un numr dat x ncep&nd cu poziia p" <incl0d)1io*tr)a=#h2 +oid =ain() > int n,(,x; co0t11?n0=ar0l @ A; cin22x; co0t11An0=ar0l d) biti @ A; cin22n; co0t11A(o,itia @ A; cin22(; co0t11An0=ar0l )*t) @?11 (x22()47(7011n); B )n partea st&ng a operatorului * se elimin primii p bii prin deplasarea la dreapta" %entru a extrage cei ! bii' se realizeaz n partea dreapt un filtru' set&nd primii ! bii pe + i terg&ndu-i pe ceilali" Exemplul ": O ImascJ este o constant sau o variabil folosit pentru extragerea biilor dorii dintr-o alt variabil sau expresie" 4in moment ce constanta Ii!tJ + are reprezentarea pe bii >>>>>>>>> >>>>>>>1' aceasta poate fi folosit pentru determinarea bitului cel mai nesemnificativ dintr-o expresie I i!tJ folosind o construcie de forma Iexpresie * 1G" ,ie declaraia int j; atunci expresia j41 are valoarea * dac j este par i valoarea +' dac j este impar" 4ac dorim s gsim valoarea unui anume bit dintr-o expresie' putem folosi o masc care are + n acea poziie i * n rest" 4e exemplu' putem folosi expresia 1//5 pentru a vedea al treilea bit (numr&nd de la dreapta!" (xpresia (+4(1112)) are valoarea + sau * dup cum este al treilea bit din I6J" /lt exemplu de masc este valoarea constant 5;; (adic 5H)1!" (a are reprezentarea >>>>>>>> 11111111" 4eoarece doar octetul din dreapta este +' atunci expresia 6 *5;; va ntoarce o valoare egal cu octetul din dreapta al variabilei 6" 0punem c 5;; este o masc pentru octetul din dreapta"
(xpresia 6ar1 6ar operator expresie7 mai poate fi scris i 6ar operator 1 expresie7 (xist +* combinaii posibile permise operatorilor de atribuire compus i anume : - . combinaii cu operatori aritmetici : (1 , ) 1 , +1 , -1 , .1 - . combinaii cu operatori pe bii : 31 , *1 , 21 , //1 , 001 (xecutarea unei instruciuni care folosete operatori compui de atribuire este mult mai rapid deoarece compilatorul' cunosc&nd c primul operand i rezultatul au aceeai locaie de memorie' folosete un numr mai mic de operaii' av&nd nevoie de un timp de execuie mai mic dec&t atribuirea n cazul general" Exemplul 1: ,olosirea operatorului de aflare a restului " int k=6,j=%; k"=j; /* k=0+,=1 */ Exemplul 2: ,olosirea operatorului de deplasare pe bii " int k=7,j=3; k11=j; /* k=k*.!=7*1=,0 */ Exemplul 3 : ,olosirea operatorului de deplasare la dreapta pe bii i apoi a operatorului aritmetic de adunare" int a=3,b=%,c; a+=b22=c=2; /* c=. / *=,/..=1 / a=! 1=" */ Exemplul 4 : ,olosirea operatorului 0/= (>$#=02? pentru interschimbarea valorilor a dou variabile" 0n*i.n)d int k=6,j= ; k:=j:=k:=j; Exemplul 5 : ,olosirea operatorului M2 pe bii " lon. k; k4=7k; /* k=0 / indiferent de valoarea sa ini&ial% */ Exemplul 6 : 0n*i.n)d *hort k; *hort j; k5=7k; /* k=.10)1=0,,!, / indiferent de valoarea sa anterioar% */ j5=7j; /* dac% ' este cu se$n/ atunci valoarea sa devine 21 */ Exemplul !: int k; k:=k; /* k=0 / indiferent de valoarea sa anterioar% */ Exemplul ": int k=-2%; k11=2; /* k= ).,*..= )100 */ Exemplul #: (xpresia de asignare j*=k+3; este echivalent cu j=j*(k+3); i nu cu j=j*k+3; Exemplul 1$: ,ie declaraiile: int i=1,j=2,k=3,==4; 'x(r)*i) i+=j+k j*=k==+% 'x(r)*i) )chi+al)nta i+=(j+k) j*=(k=(=+%)) 'x(r)*i) )chi+al)nta i=(i+(j+k)) j=(j*(k=(=+%))) -aloar) 6 1;
Informatic clasa a X-a /* are ca efect ordonarea cresc%toare a varia*ilelor x -i 3; ca re#ultat se o*&ine cea $ai $are dintre valorile x -i 3 */
<