|
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 ).
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
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:
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
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
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
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
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
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
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 )
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
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.
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
} |
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;
} |
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:
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
}
Copyright
© 2001-2002. Carmen Holotescu
All
rights reserved. Published by Timsoft
|