<<Pagina Materiale

 
 
 Operatori 
Operatori si expresii

Limbajul C se caracterizeaza printr-un set foarte larg de operatori.
Operatorii sunt simboluri utilizate pentru precizarea oparatiilor care trebuie executate asupra operanzilor.
Operanzii pot fi constante, variabile, nume de functii, expresii.
Expresiile sunt entitati construite cu ajutorul operanzilor si operatorilor, respectand sintaxa si semantica limbajului. Cea mai simpla expresie este cea formata dintr-un singur operand.

Clasificarea operatorilor:

  • dupa numarul operanzilor prelucrati:
    • unari
    • binari
    • ternari - cel conditional; alte limbaje de nivel inalt nu definesc astfel de operatori 
  • dupa ordinea de succedare a operatorilor si operanzilor:
    • prefixati
    • infixati
    • postfixati
  • dupa tipul operanzilor si al prelucrarii:
    • aritmetici
    • relationali
    • logici
    • la nivel de bit.
Operatorii se impart in clase de precedenta, fiecare clasa avand o regula de asociativitate, care indica ordinea aplicarii operatorilor consecutivi de aceeasi precedenta ( prioritate ).
Sus
Tabela operatorilor
  
Operator
Utilizare
Semnificatie
Asociativitate
( ) 
[ ] 

-> 
-- 
++
f(e) 
t[i] 
s.c 
p->c 
a-- 
a++
apel functie 
indexare 
selectie 
selectie indirecta 
postdecrementare 
postincrementare
----------->


-- 
++ 




sizeof 
( )
-v 
+v 
--a 
++a 
!i
~i 
*p 
&a 
sizeof(x) 
(d) e
schimbare semn 
plus unar ( fara efect) 
predecrementare 
preincrementare 
negatie logica 
complementare ( negare bit cu bit ) 
adresare indirecta 
preluare adresa 
determinare dimensiune  ( in octeti ) 
conversie de tip ( cast )
<-----------








<< 
>> 



<= 

>= 


== 
!= 











&& 


||
v1*v2 
v1/v2 
v1%v2 


v1+v2 
v1-v2 


i1<<i2 
i1>>i2 


v1<v2 
v1<=v2 
v1>v2 
v1>=v2 


v1==v2 
v1!=v2 


i1&i2 


i1^i2 


i1|i2 


i1&&i2 


i1||i2
inmultire 
impartire 
rest impartire ( modulo ) 


adunare 
scadere 


deplasare stanga 
deplasare dreapta 


mai mic 
mai mic sau egal 
mai mare 
mai mare sau egal 


egal 
diferit 


si pe biti 


sau exclusiv pe biti 


sau pe biti 


si logic ( conjunctie ) 


sau logic ( disjunctie )

 
 
 
 
 

----------->




















 

? : 



*=  /=  %= 
+=  -= 
&=  ^=  |= 
<<=  >>=
  i?v1:v2 


a=v 

a*=v 

 

operator conditional ( ternar ) 


atribuire 

variante ale 
operatorului de atribuire 
 

<-----------
, e1,e2 secventiere
----------->

Legenda:
a-variabila intreaga sau reala    i-intreg
c-camp                                   v-valoare intreaga  sau reala
d-nume tip                              p-pointer
e-expresie                              s-structura sau uniune
f-nume de functie                    t-tablou
x-nume tip sau expresie

Sus
Conversii de tip. Operatorul de conversie explicita (cast)

La evaluarea expresiilor pot apare conversii implicite:

  • in expresia variabila=expresie se evalueaza prima data expresia, fara a tine cont de tipul variabilei; daca tipul rezultatului obtinut este diferit de cel al variabilei, se realizeaza conversia implicita la tipul variabilei
  • daca o expresie are doar operanzi intregi, ei se convertesc la int
  • daca o expresie are doar operanzi reali sau intregi, ei se convertesc la double.
Operatorul de conversie explicita ( cast ) se utilizeaza cand se doreste ca tipul unui operand ( expresie ) sa fie altul decat cel implicit. Operatorul este unar, are prioritate ridicata si are sintaxa:
      ( tip ) expresie

Exemple:

  • conversii implicite
int i; char c='c';long l; float f;
i=2.9; // 2.9 e convertit implicit la int, deci i va fi 2
f='A'; // f va fi 65.0 ( codul ASCII )
i=30000+c; // expresia se calculeaza in domeniul int, i va fi 30099
i=30000+10000; // calcul expresie in domeniul int, apare depasire, nesemnalata, i va fi -25536
l=30000+10000; // -25536 va fi convertit la long
l=30000u+10000; // rezultat corect
l=30000l+10000; // rezultat corect
  • conversii explicite
float r;
r=5/2; // impartirea se face in domeniul int, deci r va fi 2.0
r=(float)5/2; // r va fi 2.5, pentru ca primul operand este de tip float, deci calculul se face in domeniul real
Sus
Operatorul sizeof

Rezultatul aplicarii acestui operator unar este un intreg reprezentand numarul de octeti necesari pentru stocarea unei valori de tipul operand sau pentru stocarea rezultatului expresiei ( care nu se evalueaza ), daca operandul este o expresie. Operatorul are efect la compilare, pentru ca atunci se stabileste tipul operanzilor. 
Sintaxa:
  sizeof (tip)
 sizeof (expresie)

Exemple:

In fereastra de evaluare ( deschisa cu CTRL/F4 ) se pot tasta expresiile:
 sizeof('a')
 sizeof(int)
 sizeof(2.5 + 3)
si vor apare rezultatele 2, 2, 8 - ultima expresie e de tip double ( constanta 2.5 e de tip double ).

Linia de program:
   printf(" valoare long double pe %d octeti\n", sizeof(long double));
afiseaza pe ecran:
valoare long double pe 10 octeti

Sus
Operatorii aritmetici

Operatorii aritmetici sunt in ordinea descrescatoare a prioritatii:

  • operatorii unari de pastrare/schimbare a semnului:   +  -
  • operatorii binari multiplicativi - de inmultire, impartire, modulo:  * / %
  • operatorii binari aditivi - de adunare si scadere:  + -
Depasirile la calculele cu reali sunt semnalate, cele la calculele cu intregi, nu. Se semnaleaza de asemenea eroarea de impartire cu 0.

Exemplu:

printf("30000+10000=%d\n1.e20f*1.e20f\n",30000+10000,1.e20f*1.e20f);
afiseaza pe ecran urmatoarele informatii, nesemnalandu-se depasirea din domeniul int, ci doar cea din domeniul float:
-25536
+INF

Sus
Operatorii de adresare

Operatorii de adresare sunt utilizati pentru a obtine adresa unei entitati:

  • indexare []
  • selectie directa .
  • selectie indirecta ->
  • determinare adresa &
  • adresare indirecta *
Operatorul de determinare a adresei & este unar, operandul fiind o variabila. Pana in prezent, s-a vazut utilizarea lui in determinarea adreselor variabilelor care se transmit ca parametri functiei scanf

O adresa se poate tipari folosind prototipul %p, valoarea adresei fiind tiparita in hexazecimal ( adresa se considera pointer near, ceea ce se tipareste fiind offsetul adresei ).

Ceilalti operatori din aceasta categorie vor fi discutati la  capitolele referitoare la tablouri, pointeri, structuri.

Exemple:

int i;
printf("valoare:");
scanf("%d",&i); //functiei scanf i se transmite ca parametru adresa variabilei de citit
printf("valoarea lui i=%d,adresa lui i=%p\n",i,&i); //o adresa se poate tipari folosind %p

Sus
Operatorii de atribuire

Spre deosebire de alte limbaje in care atribuirea este o instructie, in limbajul C se defineste operatorul de atribuire =.

Aceste este binar si are o prioritate scazuta, mai mare doar decat a operatorului secvential , ;regula de asociativitate este de la dreapta spre stanga, iar sintaxa este:
    variabila=expresie

Expresia este evaluata, apoi rezultatul ei este memorat in variabila si este furnizat si ca efect lateral, astfel incat poate fi utilizat.

Exemple:

int i,j,k;
i=j=k=0;  // efectul lateral este folosit, variabilele sunt initializate cu aceeasi valoare, 0

// secventa urmatoare calculeaza baza si volumul unui paralelipiped
float lungime,latime,inaltime,baza,volum;
volum=inaltime*(baza=lungime*latime);

Limbajul C defineste operatorii de atribuire compusi, care permit o scriere mai compacta a atribuirilor de forma:
    variabila=variabila op expresie
prin
    variabila op= expresie
Se definesc astfel operatorii  +=   -=   *=   /=   %=   &=   |=   ^=   <<=   >>=  ( ultimii cinci sunt operatori pe biti )

Exemple:

int i=3,j=9,k=11;
i+=j;  // atribuirea este echivalenta cu i=i+j;
k%=j-=4; // asocierea fiind de la dreapta la stanga, prima data se calculeaza j-=4, 
        // deci j va fi 5, valoare care este folosita prin efect lateral pentru k%=5, deci k va fi 1

Din aceasta categorie mai fac parte si operatorii unari de incrementare si decrementare ++, respectiv --. Pot fi utilizati ca operatori prefixati sau postfixati:
     ++variabila
    variabila++
    --variabila
    variabila--
Expresiile ++variabila, variabila++ sunt echivalente cu variabila+=1, dar efectul lateral la preincrementare este de a furniza valoarea variabilei dupa incrementare, iar la postincrementare valoarea furnizata este cea dinaintea incrementarii.

Exemple:

// scrise ca instructiuni, deci efectul lateral nefolosindu-se, expresiile urmatoare sunt echivalente:
i++;  ++i;  i=i+1;  i+=1;

int i=3,j=9,k;
k=++i+j--; // i va fi 4, j va fi 8, iar k va fi 13, in adunare intrand valoarea lui j inainte de decrementare

Sus
Operatorii relationali

Operatorii relationali sunt binari si expresiile in care apar sunt 0, daca relatia e falsa, 1 daca e adevarata.

C-ul nu defineste tipul boolean, asa incat: 0 este interpretat ca valoarea logica fals, iar orice valoare diferita de 0 este interpretata ca adevarat.

Operatorii relationali sunt:
<   <=   >   >=
==   !=               ( egal, diferit )

A nu se confunda conditia a==b cu expresia a=b, ultima avand valoarea adevarat pentru orice valoare a lui b diferita de 0.

Exemple:

int i=4,j=5; float f=4.0;
printf("%d %d %d\n",i==j, i>=j-2, i==f, 2<=i+j<=1); //  se tipareste 0 1 1 1 - revedeti prioritatea si 
// asociativitate pentru a intelege evaluarea ultimei expresii - operatorii aritmetici au prioritate mai ridicata decat cei relationali,
// iar asociativitatea pentru operatorii relationali e de la stanga la dreapta ( 2<=9 e adev deci 1, iar 1<=1 e adev )

Sus
Operatorii logici

Conditiile mai complexe se obtin aplicand conditiilor simple operatorii logici:
!         negatie logica
&&    si logic
||        sau logic

Operanzii sunt intregi, interpretati ca valori logice. Prioritatea operatorilor && si || este mai scazuta decat a celor conditionali, a celui de negare, fiind unar, este cea mai ridicata. 

Operatorii trateaza operanzii ca valori logice, deci orice valoarea diferita de 0 este interpretata ca adevarat, iar 0 ca fals. Aplicand unui intreg operatorul de negatie logica, se obtine 1 daca operandul e fals, respectiv 0 daca operandul este adevarat.
 

x
y
!x
x&&y
x||y
0
0
1
0
0
0
!=0
1
0
1
!=0
0
0
0
1
!=0
!=0
0
1
1

Se observa din tabela de mai sus ca daca primul operand al expresiei in care apare operatorul && este 0, sigur rezultatul final este 0, indiferent de valoarea celui de-al doilea. Similar, daca primul operand al expresiei in care apare operatorul  || este !=0, sigur rezultatul final este 1, indiferent de valoarea celui de-al doilea. 

Expresiile logice in C se calculeaza in short circuit, adica daca primul operand are valorile de mai sus, corespunzator operandului && sau ||, cel de-al doilea operand nu se mai evalueaza. Aceasta implica necesitatea codificarii cu atentie a expresiilor logice.

Exemple:

int a=4,b=6;
printf("%d %d %d %d\n", !a, !!a, a&&b-6, a||(b=8)); // 0 1 0 1
printf("b=%d\n"); // se tipareste b=6 - in al patrulea argument de mai sus cel de-al doilea operand nu s-a evaluat

Sus
Operatorul conditional

Operatorul conditional ? : este singurul operator ternar. Are prioritatea mai ridicata doar decat a operatorilor de atribuire si a celui secvential, iar asociativitatea este de la dreapta spre stanga. El se foloseste in situatiile in care exista doua variante de obtinere a unui rezultat, dintre care se alege una singura, functie de indeplinirea sau neindeplinirea unei conditii. Cei trei operanzi sunt expresii, prima reprezentand conditia testata.
    expr0 ? expr1 : expr2
Daca valoarea expr0 este adevarata ( !=0 ), se evalueaza expr1, altfel expr2, rezultatul expresiei evaluate fiind rezultatul final al expresiei conditionale.

Exemple:

Expresia de mai jos determina valoarea maxima dintre a si b, pe care o memoreaza in max:
    max=a>b?a:b;
Acelasi rezultat se obtine daca se foloseste instructiunea if:
    if(a>b)max=a;
    else max=b;

Functie de ora memorata in variabila hour, functia puts va tipari mesajul corespunzator:
    puts(hour<0||hour>24?"Ora invalida":hour<12?"Buna dimineata!":hour<18?"Buna ziua!":
         hour<22?"Buna seara":"Noapte buna!");
                  //observati evaluarea de la dreapta la stanga a expresiilor conditionale multiple

Scrieti secventa echivalenta care foloseste instructiunea if.

Sus
Operatorul secvential

Operatorul secvential , ( virgula ) este cel cu prioritatea cea mai scazuta. Se foloseste atunci cand sintaxa limbajului impune prezenta unei singure expresii, iar prelucrarea presupune evaluarea a doua sau mai multor expresii; acestea se evalueaza de la stanga la dreapta, iar rezultatul iintregii expresii este cel al ultimei expresii ( exprn ):
    expr1,expr2,...,exprn

Exemple:

Expresia de mai jos memoreaza in max valoarea maxima dintre a si b, realizand si ordonarea descrescatoare a acestora (
deci le interschimba daca a<b -- a se observa ca interschimbarea presupune utilizarea unei variabile auxiliare  ):
    int a,b,aux,max;
    max=a>=b?a:(aux=b,b=a,a=aux); //operatorul secvential e necesar pentru a avea o singura expresie dupa :

Folosind instructiunea if, prelucrarea de mai sus se poate scrie:
    if(a<b)aux=b,b=a,a=aux;  //interschimbare daca a<b, deci in a va fi valoarea maxima max=a;

Urmatoarele doua secvente sunt echivalente, prelucrand un sir  de valori introduse de la tastatura, terminata cu CTRL/Z -- in cea de-a doua varianta, mai compacta, conditia lui while este o expresie in care apare operatorul secvential :
 

int curent,ind;
printf("valoare=");
ind=scanf("%d",&curent);
while(ind!=EOF){
    //prelucrare curent
   printf("valoare=");
   ind=scanf("%d",&curent);
}
int curent;
while(printf("valoare="),ind=scanf("%d",&curent)!=EOF){
    //prelucrare curent
}
Sus
Operatorii pe biti

Operatorii la nivel de bit se aplica fiecarui bit din reprezentarea operanzilor intregi, spre deosebire de restul operatorilor care se aplica valorilor operanzilor.

Din aceasta categorie fac parte operatorii urmatori, care apar in ordinea descrescatoare a prioritatii:
    ~        complementare
    >>      deplasare la dreapta
    <<      deplasare la stanga
    &        si
    ^         sau exclusiv
    |          sau

Operatorul ~ transforma fiecare bit din reprezentarea operandului in complementarul sau -- bitii 1 in 0 si cei 0 in 1.
Operatorii &, ^, | realizeaza operatiile si, sau exclusiv, respectiv sau intre toate perechile de biti corespunzatori ai operanzilor. Daca b1 si b2 reprezinta o astfel de pereche, tabelul urmator prezinta valorile obtinute prin aplicarea operatorilor &, ^, |.
 

b1
b2
b1&b2
b1^b2
b1|b2
0
0
1
1
0
1
0
1
0
0
0
1
0
1
1
0
0
1
1
1

Din tabela de mai sus se observa ca aplicand unui bit:

  • operatorul & cu 0, bitul este sters
  • operatorul & cu 1, bitul este neschimbat
  • operatorul | cu 1, bitul este setat
  • operatorul ^ cu 1, bitul este complementat.
Exemplu:

char a,b;

a
b
~a
!a
~b
!b
a&b
a^b
a|b
00000000
00000001
11111111
1
11111110
0
00000000
00000001
00000001
11111111
10101010
00000000
0
01010101
0
10101010
01010101
11111111

In cazul operatorilor de deplasare, care sunt binari, primul operand este cel al carui biti sunt deplasati, iar al doilea indica numarul de biti cu care se face deplasarea -- deci numai primul operand este prelucrat la nivel de bit:
    a<<n
    a>>n

La deplasarea la stanga cu o pozitie, bitul cel mai semnificativ se pierde, iar in dreapta se completeaza cu bitul 0.
La deplasarea la dreapta cu o pozitie, bitul cel mai putin semnificativ se pierde, iar in stanga se completeaza cu un bit identic cu cel de semn.
Cu exceptia cazurilor cand se produce depasire, deplasarea la stanga cu n biti echivaleaza cu inmultirea cu 2 la puterea n.
Analog, deplasarea la dreapta cu n biti echivaleaza cu impartirea cu 2 la puterea n. Este indicat a se realiza inmultirile si impartirile cu puteri ale lui 2 prin deplasari, ultimele realizandu-se intr-un timp mult mai scurt.

Exemple:

  • Cele doua secvente din tabela conduc la aceleasi rezultate:
    int i;
i*=8;
i/=4;
i*=10;
i<<=3;
i>>=2;
i=i<<3+i<<1;
  • In tabela urmatoare apar valorile obtinute ( in binar si zecimal ) prin aplicarea operatorilor de deplasare:
    char a;
a
a<<1
a<<2
a>>1
a<<2
00000001
1
00000010
2
00000100
4
00000000
0
00000000
0
00001110
14
00011100
28
00111000
56
00000111
7
00000011
3
11111111
-1
11111110
-2
11111100
-4
11111111
-1
11111111
-1
11011101
-35
10111010
-70
01110100
116(depasire)
11101110
-18
11110111
-9
  • Mai jos este prezentata o secventa care construieste o masca ce contine n biti de 1 incepand cu pozitia p, spre dreapta ( bitul cel mai putin semnificativ se considera ca fiind de pozitie 0 )-- secventa poate fi utilizata in rezolvarea problemei 13:
int masca=0, unu=1;
int i,p=5,n=3;

unu<<=p;  // bitul 1 este pe pozitia p
for(i=1;i<=n;i++){
 masca|=unu;
 unu>>=1;
}

Sus
Quiz

Stiti deja: daca la autotestele de mai jos, alegeti varianta corecta, pasul urmator sunt Exercitiile!
Daca nu, revedeti putin notitele de mai sus :-)

1.Valoarea variabilei real definita double real=26/4; este:

2.Daca int a=29,b=7; a%=b--; valoarea lui a va fi:

3.Daca int i=1; char c='1'; valoarea expresiei i<c este: 

4.Daca int x=-1,y; y=++x?5:7; valoarea lui y va fi:

Sus
Exercitii

 1.Rulati urmatoarele doua secvente, observand conversiile implicite si explicite:

             char c='a',cc;
     int i=4;
     float f=5.95;
     printf("%d %f\n",i,f);
     i=f; // conversie implicita, trunchiere
     printf("%d %f\n",i,f);
     f=i+100000; // conversie implicita a rezultatului expresiei
     printf("%d %f\n",i,f);
     i=-99.001; // conversie implicita, trunchiere
     f='a';
     c=0x3239; cc=-i; // preluarea ultimului octet
     printf("%d %f %c %c\n",i,f,c,cc);

     float r1=5/2,
     r2=(float)5/2,
     r3=(float)(5/2),
     r4=5/(float)2,
     r5=(float)5/(float)2;
     printf("%f %f %f %f %f\n",r1,r2,r3,r4,r5);

2.a) Gasiti valorile expresiilor de mai jos. Verificati rezultatele obtinute, tastand expresiile in fereastra de evaluare ( deschisa cu CTRL/F4 ).

             sizeof(int)
     sizeof(double)
     sizeof(long double)
     sizeof('a')
     sizeof((char)'a')
     sizeof(33000)
     sizeof(1.3+'a')
     sizeof(1.3f)
     sizeof(1.3)
     sizeof(1.3l)
     sizeof(5/2)
     sizeof((float)5/2)

b) Gasiti ce tipareste pe ecran urmatorul program? Verificati, rulandu-l.

           #include <stdio.h>
      void main (void){
           puts("Dimensiunea in octeti ocupata de:");
           printf("int\t%d\n",sizeof(int));
           printf("char\t%d\n",sizeof(char));
           printf("long\t%d\n",sizeof(long));
           printf("32780\t%d\n",sizeof(32780));
           printf("32780u\t%d\n",sizeof(32780u));
           printf("-10000\t%d\n",sizeof(-10000));
           printf("'a'\t%d\n",sizeof('a'));
           printf("07111111\t%d\n",sizeof(07111111));
           printf("22l\t%d\n",sizeof(22l));
      }

3.Rulati programele de mai jos pas cu pas, urmarind valorile variabilelor in fereastra Watch, in baza 10 si 16 (nume_variabila,x ):

void main(void){
     int i=20000,j=15000,k;
     float r;
     scanf("%d",&k);
     printf("%d %p\n",k,&k);
     k=i+j;
     r=i+j;
     r=(float)i+j;
     r=(long)i+j;
     r=i/j;
     k=i/j;
     r=(float)i/j;
     k=i%j;
     k=+ - - -i;
     k=+ - --i;
     k=- +j--;
     i=k/(j-j);
}

void main(void){
  int a,b,c; float z;
  a=25000;b=20000;
  c=a+b;
  z=a+b;
  c=(float)a+b;
  z=(float)a+b;
  c=a/b;
  c=a%b;
  c=a>b;
  c=a==b;
  a=3;b=11;
  c=a++ + ++b;
  c=a&b;
  c=a|b;
  c=a^b;
  c=b<<2;
  c=-a>>3;
  c=~a;
  a=0;
  c=a&&b;
  c=a||b;
  c=!a;
  a=4;
  c=a&&b;
  c=a||b;
  c=!a;
  a=2;c=3;
  c*=a;
  b=5;
  c=(a>b)?a:b;
}

4 Pentru un intreg x citit de la tastatura, sa se calculeze intr-o singura expresie primele cinci puteri, care apoi sa se afiseze:

    int x,x2,x3,x4,x5; // se observa in urma rularii ca 8^5 apare negativ
    printf("x=");scanf("%d",&x); // deci se vor face modificarile pentru tipul long
    x5=(x4=(x3=(x2=x*x)*x)*x)*x;
    printf("%d %d %l %d %d\n",x,x2,x3,x4,x5);

5 Folosind operatorul ternar, sa se tipareasca maximul dintre a,b, relatia dintre a,b si maximul dintre a,b,c cititi de la tastatura. Sa se scrie secventele echivalente folosind instructiunea if:

    max_a_b=a>b?a:b;
    printf("%d %c %d\n",a,a>b?'>':a<b?'<':'=',b);
    max_a_b_c=a>b?(a>c?a:c):(b>c?b:c);

6.Sa se verifice ca secventa urmatoare determina maximul dintre a si b, iar daca a<b, le interschimba, astfel incat secventa a si b sa fie descrescatoare. Sa se scrie  secventa echivalenta folosind instructiunea if:

    max_a_b=a<b?(t=b,b=a,a=t):a;

7.Pentru un n citit de la tastatura sa se afiseze valorile mai mari/mai mici decat n de 2,4,8,16 ori obtinute prin inmultiri/impartiri, respectiv deplasari.

8.Pentru valori intregi ( pozitive sau negative ) citite de la tastatura sa se tipareasca valoarea corespunzatoare in binar. Sa se scrie secventa echivalenta, in care cifrele reprezentarii se obtin ca resturi ale impartirii repetate la 2, pana la catul 0 - cifrele sunt obtinute insa incepand cu cea mai putin semnificativa:

 int n,i,dim=sizeof(i)*8,masca=1;
 while(1){
 printf("n=");scanf("%d",&n);
 for(i=dim-1;i>=0;i--)
   putchar(n&masca<<i?'1':'0');
 }

9.Se citesc intregii x,y,a,b ( 0<=a,b<16). Se cere sa se afiseze:
-bitul (a+b) din x
-valoarea obtinuta prin setarea bitilor a si b din x
-valoarea obtinuta prin stergerea bitilor a si b din x
-valoarea obtinuta prin inversarea bitilor a si b in x
-valoarea obtinuta prin negarea, respectiv complementarea lui y
-valorile obtinute prin aplicarea lui x si y a operatorilor si logic, sau logic, si pe biti, sau pe biti, sau exclusiv pe biti.
Obs. Toate citirile si afisarile se vor face in baza 16; bitul 0 este cel mai putin semnificativ, iar 15 este cel mai semnificativ.

10.Fiind date urmatoarele definitii:
 int i = 3, j = 5,c1,c2,c3,c4;
determinati valorile tuturor variabilelor, dupa executia secventei:
 c1=(i/2) + 'b' + i-- - - - 'c';
 c2=(j%8) * i;
 c3=(i++) - (--j);
 c4=j = (i += 2);

11.Fiind date definitiile:
 int a=2, b=2, c=1, d=0, e=4, i = 2, j = 4;
determinati valorile urmatoarelor expresii:
  a) a++ / ++c * --e
 b) --b * c++ -a
 c) -b - --c
 d) e / --a * b++ /c++
 e) e / --a * b++ / c++
 f) a %= b = d = 1 + e /2
  g) j = (i++ , i -j)

12.Se citesc 2 numere intregi x si n unde n este intre 0 si 15. Sa se afiseze:
-bitul n din x
-numarul x in care se seteaza bitul n
-numarul x in care se sterge bitul n
-numarul x in care se complementeaza bitul n.

13.Se citesc intregii x,n,p. Sa se afiseze:
-numarul format din n biti incepand de la pozitia p (spre dreapta )
-numarul obtinut prin setarea celor n biti de la pozitia p
-numarul obtinut prin stergerea celor n biti de la pozitia p
-numarul obtinut prin complementarea celor n biti din pozitia p
( cei n biti incepind din pozitia p sunt bitii p,p-1,...,p+1-n ).

14.Se citesc intregii x,y,n,p. Sa se copiezeze in x, incepand din pozitia p, ultimii n biti din y si sa se afiseze noua valoare a lui x.

15 Se citeste intregul x. Sa se afiseze x si numarul obtinut prin interschimbarea intre ei a octetilor lui x, in bazele 10, 16 si 8.
Pentru a putea face mai multe teste la o singura rulare, incadrati secventa in corpul unei instructiuni 
while(1){ 
  //aici apare secventa - executia programului se va opri cu CTRL/Break
}
 

Sus
<<Pagina Materiale


Copyright © 2001-2002. Carmen Holotescu
All rights reserved. Published by Timsoft