Sunteți pe pagina 1din 18

Echipamente programabile – Laborator 9 & 10

George Mois
December 3, 2021

Abstract
Pointeri, stdint.h, operatori.

1 Pointeri
Un pointer este un tip de date special ı̂n C care cont, ine o adresă către o locat, ie de mem-
orie. Cu alte cuvinte, indică locat, ia unui bloc de memorie care la rândul său cont, ine
date de interes. Pointerii sunt o particularitate esent, ială a limbajului de programare C,
sporindu-i puterea prin utilizarea lor pentru:

• configurarea adreselor din regis, trii perifericelor;


• scrierea/citirea regis, trilor de date ale perifericelor;
• scrierea/citirea locat, iilor de memorie SRAM/FLASH...

Figure 1: Pointeri (ı̂n stânga fiecărei locat, ii de memorie)

O variabilă de tip pointer stochează adresa altei variabile. Un nume de variabilă


face trimitere direct la o valoare, iar un pointer indirect face referire la o valoare.
Referirea unei valori printr-un pointer se numes, te indirection.

1
Scopul pointerilor este de a permite programatorilor să acceseze manual, direct, un
bloc de memorie. Pointerii sunt folosit, i ı̂n mod predominant pentru s, iruri s, i structuri.
Definit, ia pointerului este strâns legată de cont, inutul din locat, ia de memorie. As, adar,
operat, iunile principale legate de pointeri sunt:

• citirea locat, iei de memorie indicată prin pointer;


• citirea cont, inutului locat, iei de memorie indicată prin pointer;
• incrementare/decrementare pointer (avansarea/glisarea la următoarea/anterioara
locat, ie de memorie).

Este de ret, inut faptul că pe o mas, ină de 64 de bit, i, dimensiunea pointerului este de
8 octet, i (64 de bit, i).
Definirea unui pointer ı̂n program se face ı̂n mod similar cu definirea unei variabile.

1.1 Sintaxa

data type * identifier ;

• data type – tipul de date a pointerului (pointer către un tip de date);


• * – simbolul folosit pentru definirea pointerului;
• identifier – numele pointerului.
Tipurile de date pentru pointeri ı̂n C sunt:
char * unsigned char *
int * unsigned int *
long long i n t * unsigned long long i n t *
float* unsigned float*
double * unsigned double *

1.2 Exemplu

int * i n t p t r ; / / a p o i n t e r t o an i n t e g e r
char * c h a r p t r ; / / a pointer to a character

1.3 Init, ializare

i d e n t i f i e r = value ;
d a t a t y p e * i d e n t i f i e r = &i d e n t i f i e r ;
value este valoarea de la adresa (locat, ia din memorie) unei variabile. Pentru a
obt, ine adresa unei variabile, se foloses, te operatorul (&).

2
1.4 Exemplu

# i n c l u d e <s t d i o . h>

i n t main ( v o i d )
{
/ / asignarea unei constante unui p o i n t e r
/ / p o i n t e r 0 x00007FFF8E3C3824
l o n g l o n g i n t someAddr = 0 x00007FFF8E3C3824 ; / / o v a r i a b i l a

char * a d d r e s s 0 = 0 x00007FFF8E3C3824 ; / / i n c e r c a r e i n i t i a l i z a r e

char * a d d r e s s = ( char * ) 0 x00007FFF8E3C3824 ; / / p o i n t e r

return 0;
}
Prima idee ar fi definirea unui pointer ca s, i ı̂n prima instruct, iune de mai sus. Din
punct de vedere al compilatorului, ı̂ncercăm să atribuim un număr constant unui tip de
date de tip pointer. El va observa o nepotrivire a dimensiunii (constantă long long int
vs. pointer de tip char) s, i este necesara specificarea termenului din dreapta ecuat, iei ca
pointer (următoarea instruct, iune).
address este o variabilă pointer de tip char*. Compilatorul alocă 8 octet, i pentru a
stoca pointerul, indiferent de tipul său. Cu alte cuvinte, tipul de date al pointerului nu
influent, ează dimensiunea ı̂n memorie a variabilei de tip pointer.

Figure 2: Variabile de tip pointer

1.5 Exemple

int var1 = 5;
i n t * i n t p t r = NULL ;
i n t p t r = &v a r 1 ; / / i n t p t r t a k e s t h e a d d r e s s o f i n t v a r i a b l e v a r 1

char v a r 2 = ’A ’ ;

3
char * c h a r p t r = &v a r 2 ; / / c h a r p t r t a k e s t h e a d d r e s s o f c h a r v a r i a b l e v a r 2

1.6 Tipul de date al pointerului


Dacă tipul de date al pointerului nu influent, ează dimensiunea ı̂n memorie a variabilei
de tip pointer, atunci de ce avem nevoie sa declaram tipul de date al pointerului?
char t = 2 5 ; / / s e a l o c a un o c t e t

char * a d d r e s s 0 = 0 x00007FFF8E3C3824 ; / / s e a l o c a 8 o c t e t i
Tipul de date al pointerul determina comportamentul operat, iilor (citire, scriere, in-
crementare, decrementare) asupra variabilei de tip pointer.

1.7 Exemplu

/ * C i t i r e a v a r i a b i l e i g e n e r e a z a 1 o c t e t de d a t e * /
char * a d d r e s s 1 = ( char * ) 0 x00007FFF8E3C3824 ;

/ * C i t i r e a v a r i a b i l e i g e n e r e a z a 4 o c t e t i de d a t e * /
i n t * a d d r e s s 2 = ( i n t * ) 0 x00007FFF8E3C3824 ;

/ * C i t i r e a v a r i a b i l e i g e n e r e a z a 8 o c t e t i de d a t e * /
l o n g l o n g i n t * a d d r e s s 3 = ( l o n g l o n g i n t * ) 0 x00007FFF8E3C3824 ;

/ * C i t i r e a v a r i a b i l e i g e n e r e a z a 1 o c t e t de d a t e * /
char * a d d r e s s 1 = ( char * ) 0 x00007FFF8E3C3824 ;
/ / V a r i a b i l a de t i p p o i n t e r l a d a t e de t i p c h a r

4
1.8 Dereferent, ierea unui pointer
Accesarea valorii aflată la locat, ia către care indică un pointer se numes, te dereferent, ierea
unui pointer. Operatorul (*) returnează valoarea obiectului către care indică operandul
său. De exemplu, ptr este adresa unei variabile, ı̂n timp ce *ptr este valoarea variabilei
către care ptr indică.
• * – operatorul ”valoare la adresa” (value at address)
• & – operatorul ”adresa lui” (address of)

Figure 3: Pointer dereference

1.9 Exemplu

char * a d d r e s s 1 = ( char * ) 0 x00007FFF8E3C3824 ;

char d a t a = * a d d r e s s 1 ; / / d e r e f e r e n t i e r e p t c i t i r e a d a t e l o r
/ / s e c i t e s t e un o c t e t d i n p o i n t e r s i s e s t o c h e a z a i n v a r d a t a

1.10 Exemplu

# i n c l u d e < s t d i o . h>

i n t main ( )
{
int var1 = 5;
i n t * i n t p t r = &v a r 1 ;

p r i n t f ( ” A d d r e s s o f v a r 1 : %p \n ” , &v a r 1 ) ;
p r i n t f ( ” V a l u e o f i n t p t r : %p\ n ” , i n t p t r ) ;
p r i n t f ( ” A d d r e s s o f i n t p t r : %p\n ” , & i n t p t r ) ;
p r i n t f ( ” Val o f v a r 1 : %d\ n ” , v a r 1 ) ;
p r i n t f ( ” Val o f * i n t p t r : %d \n ” , * i n t p t r ) ;
p r i n t f ( ” Val o f &* i n t p t r : %p and o f *& i n t p t r : %p \n ” , &* i n t p t r , *& i n t p t r ) ;
return 0;
}

5
Se poate observa că operatorii & si * sunt complementari.
Figura 6 ilustrează execut, ia primelor două linii ale programului de mai sus.

Figure 4: Pointer la integer – definit, ie s, i init, ializare

1.11 Scrierea unui pointer


char * a d d r e s s 1 = ( char * ) 0 x00007FFF8E3C3824 ;
* a d d r e s s 1 = 0 x89 ; / / d e r e f e r e n t i e r e p e n t r u a s c r i e d a t e

Figure 5: Scrierea unui pointer

1.12 Exercit, iu
• Creat, i o variabilă char s, i init, ializat, i-o cu valoarea 100;

6
• Afis, at, i adresa variabilei de mai sus;
• Creat, i o variabilă pointer s, i stocat, i adresa variabilei de mai sus;
• Citit, i pointerul pentru a obt, ine octetul de date către care pointează pointerul;
• Afis, at, i datele de la pasul anterior;
• Scriet, i pointerul pentru a pointa către valoarea 50;
• Afis, at, i valoarea variabilei de la primul pas.

Observat, ie:
char d a t a 0 = 1 2 ; / / &d a t a 0 va f i de t i p ” c h a r * ”
i n t d a t a 1 = 5 0 0 ; / / &d a t a 1 va f i de t i p ” i n t * ”
l o n g l o n g d a t a 2 = 5 0 0 ; / / &d a t a 2 va f i de t i p ” l o n g l o n g * ”

1.13 Important, a tipurilor de date asociate pointerilor – Pointer


arithmetic
Rulat, i codul de mai jos:
# i n c l u d e <s t d i o . h>

l o n g l o n g i n t g d a t a = 0xFFFEABCD11112345 ;

i n t main ( v o i d )
{
char * p A d d r e s s = ( char * )& g d a t a ;

p r i n t f ( ” A d r e s a p A d d r e s s e s t e %p . \ n ” , p A d d r e s s ) ;
p r i n t f ( ” V a l o a r e a l a a d r e s a %p e s t e %x . \ n ” , p A d d r e s s , * p A d d r e s s ) ;

pAddress = pAddress + 1;

p r i n t f ( ” A d r e s a p A d d r e s s e s t e %p . \ n ” , p A d d r e s s ) ;
p r i n t f ( ” V a l o a r e a l a a d r e s a %p e s t e %x . \ n ” , p A d d r e s s , * p A d d r e s s ) ;

pAddress = pAddress + 1;

p r i n t f ( ” A d r e s a p A d d r e s s e s t e %p . \ n ” , p A d d r e s s ) ;
p r i n t f ( ” V a l o a r e a l a a d r e s a %p e s t e %x . \ n ” , p A d d r e s s , * p A d d r e s s ) ;

return 0;
}
Schimbat, i tipul de date al pointerului pAddress din char* ı̂n short*, iar mai târziu
ı̂n int*. Ce observat, i?
La incrementare cu 1, pointerul avansează cu un offset de octet, i echivalent cu cel
ocupat de tipul de date al pointerului.
Aritmetica pointerilor este importantă pentru:

7
• stocarea datelor ı̂n locat, ii SRAM;
• copierea datelor din periferice ı̂n SRAM sau invers;
• configurarea regis, trilor perifericelor (fiecare registru este mapat ı̂n memorie cu o
adresă unică);
• stocarea pointerilor la rutinele de ı̂ntrerupere pentru gestionarea lor.

2 Biblioteca <stdint.h>
Biblioteca <stint.h> este o bibliotecă standard C. S-a ment, ionat anterior că dimensi-
unea tipului de date depinde de tipul de compilator folosit (de exemplu, dimensiunea
int poate fi egală cu 4 octet, i pentru unele compilatoare ı̂n timp ce poate fi 8 octet, i
pentru altele). Acest lucru duce ı̂n mod evident la probleme de portabilitate a codu-
lui. În limbajul C cele mai utilizate tipuri de date sunt int s, i long, iar ele cauzează
probleme de portabilitate. Motivul este că dimensiunea de stocare pentru cele două
tipuri ment, ionate mai sus nu este definită ı̂n standardul C (C90 sau C99). Standar-
dul defines, te doar dimensiunile minime pentru aceste tipuri de date, iar compilatorul
defines, te dimensiunea ı̂n funct, ie de capabilităt, ile hardware ale platformei t, intă. Unul
dintre motive este manipularea eficientă a datelor de către o anumită arhitectură hard-
ware (de exemplu, microcontrolere cu procesoare pe 8 bit, i sau pe 32).

2.1 Exemplu

unsigned i n t count = 0 ;
c o u n t ++;
i f ( count > 65536)
{
/ / Executa i n s t r u c t i u n i .
/ / V a l o a r e a maxima a v a r . c o u n t p o a t e f i
/ / 65535 ( i n t pe 2 o c t e t i ) s a u
/ / 4294967295 ( i n t pe 4 o c t e t i ) ,
/ / i n f u n c t i e de c o m p i l a t o r u l f o l o s i t .
/ / A s t f e l , a c e s t cod a r p u t e a s a nu f i e
/ / executat niciodata .
}
Cum putem să evităm acest tip de probleme de portabilitate? Fis, ierul header al
bibliotecii standard <stdint.h> defines, te ı̂ntregi cu lăt, ime fixă, utilizând tipuri de date
alias pentru datele standard disponibile ı̂n C. Un tip de date ı̂ntreg cu lăt, ime fixă este
un tip de date alias care specifică numărul exact de bit, i necesari pentru a stoca datele.
Numele din coloana din stânga se numesc alias-uri pentru tipul de date standard.
Prefixul u reprezintă tipul de date fără semn. În acest caz programatorul stabiles, te
numărul exact de octet, i pentru un anumit tip de date, iar problemele de portabilitate
sunt rezolvate. Această unificare a definit, iilor tipurilor de date vor fi ı̂ntotdeauna scrise
ı̂n biblioteca <stdint.h>.
Un exemplu poate fi găsit ı̂n locat, ia: C:− >MinGW− >include.

8
Table 1: Tipuri de date specificate ı̂n <stdint.h>
Alias Descriere Valori
int8 t 8 biti cu semn -128...127
uint8 t 8 biti unsigned 0...255
int16 t 16 biti cu semn -32768...32767
uint16 t 16 biti unsigned 0...65535
int32 t 32 biti cu semn -2147483648...2147483647
uint32 t 32 biti unsigned 0...4294967295
int64 t 64 biti cu semn -9223372036854775808...9223372036854775807
uint64 t 64 biti unsigned 0...18446744073709551615

Figure 6: <stdint.h>

Dacă se deschide fis, ierul <stdint.h> a altui compilator, cont, inutul va fi ı̂n general
diferit. Ceea ce contează este că alias-urile pentru tipul de date vor fi ı̂ntotdeauna
aceleas, i.
Definit, ii de ret, inut specificate ı̂n <stdint.h>:

• uintmax t – cel mai mare ı̂ntreg fără semn posibil pe sistem,


• intmax t – cel mai mare ı̂ntreg cu semn posibil pe sistem,
• uintptr t – tip de date fără semn care este suficient de ı̂ncăpător pentru a stoca
valoarea unui pointer.

9
3 Operatori
Un operator este un simbol care este utilizat pentru a efectua operat, ii logice s, i matem-
atice. Expresiile scrise ı̂n programe sunt evaluate ı̂n funct, ie de:

• prioritatea s, i asociativitatea operatorilor,


• conversia implicită a tipurilor de date ale operanzilor.

Table 2: Operatori C
Operator Descriere Tip
++,– Increment/decrement Unar
+,-,*,/,% Operatori aritmetici Binar
<, <=, >, >=, ==, ! = Operatori relat, ionali Binar
&&, ||, ! Operatori logici Binar
&, |, <<, >>,~,ˆ Operatori pentru operat, ii pe bit, i Binar
=, + =, − =, ∗ =, / =, % = Operatori de atribuire Binar
?: Operatori condit, ionali Ternar

În ceea ce prives, te operatorii aritmetici, este de ret, inut modul ı̂n care funct, ionează
operatorul ı̂mpărt, ire modulo %. Acesta produce restul din diviziune. De exemplu (14
% 4 este egal cu 2) care este restul diviziunii ı̂ntregi.
Este important de ret, inut cum funct, ionează prioritatea operatorului. Prioritatea fix-
ează ordinea ı̂n care compilatorul va optimiza codul atunci când mult, i operatori sunt
prezent, i ı̂ntr-o singură expresie. Tabelul următor arată ordinea de prioritate a multor
operatori. Nu este necesar să memorat, i aceste informat, ii, de vreme ce putet, i să folosit, i
paranteze rotunde pentru a specifica ordinea de evaluare a expresiilor.

10
Table 3: Precedent, a operatorilor s, i asociativitate
Precedence Operator Meaning of operator Associativity
15 () Functional call Left to right
[] Array element reference
-> Indirect member selection
. Direct member selection
++, -- Postfix increment and decrement
14 ! Logical negation Right to left
∼ Bitwise(1’s) complement
+ Unary plus
- Unary minus
++, -- Prefix increment and decrement
& Reference operator (address)
* Dereference operator (pointer)
sizeof() Returns the size of an object
(type-name) Type cast (conversion)
13 * Multiply Left to right
/ Divide
% Remainder
12 + Binary plus (addition) Left to right
- Binary minus (subtraction)
11 << Left shift Left to right
>> Right shift
10 < Less than Left to right
<= Less than or equal
> Greater than
>= Greater than or equal
9 == Equal to Left to right
!= Not equal to
8 & Bitwise AND Left to right
7 ˆ Bitwise exclusive OR Left to right
6 | Bitwise OR Left to right
5 && Logical AND Left to right
4 || Logical OR Left to right
3 ?: Conditional operator Right to left
2 = Simple assignment Right to left
*= Assign product
/= Assign division
%= Assign remainder
+= Assign addition
-= Assign difference
&= Assign bitwise AND
ˆ= Assign bitwise exclusive OR
|= Assign bitwise OR
<<= Assign left shift
>>= Assign right shift
1 , Separator of expressions Left to right

11
3.1 Operatori aritmetici
Următorul tabel arată tot, i operatorii aritmetici suportat, i de limbajul C s, i exemplificarea
lor utilizând variabila a (primul operand) cu valoarea 10 s, i variabila b cu valoarea 20
(al doilea operand).

Table 4: Operatori aritmetici


Operator Description Example
+ Adds two operands. a + b = 30
- Subtracts the second operand from the first operand. a - b = -10
* Multiplies the first operand with the second operand. a * b = 200
/ Divides the first operand by the second operand. b/a=2
% Computes the remainder after dividing the first operand by the second operand. a%b=0

3.2 Operatori de atribuire


Următorul tabel arată tot, i operatorii de atribuire din C s, i exemplificarea lor folosind
variabilele a s, i b.

Table 5: Operatori de atribuire


Operator Description Example
= Simple assignment operator a=b
Assigns values from right side operands to left side operand.
+= Add and assignment operator a += b is equivalent to a = a + b
Adds the right operand to the left operand and assigns the result to the left operand.
-= Subtract and assignment operator a -= b is equivalent to a = a - b
Subtracts the right operand from the left operand and assigns the result to the left operand.
*= Multiply and assignment operator a *= b is equivalent to a = a * b
Multiplies the right operand with the left operand and assigns the result to the left operand.
/= Divide and assignment operator a /= b is equivalent to a = a / b
Divides the left operand with the right operand and assigns the result to the left operand.
%= Modulus and assignment operator a %= b is equivalent to a = a % b
Takes modulus using two operands and assigns the result to the left operand.
<<= Left shift and assignment operator a <<= b is equivalent to a = a <<b
>>= Right shift and assignment operator a >>= b is equivalent to a = a >>b
&= Bitwise AND and assignment operator a &= b is equivalent to a = a & b
—= Bitwise OR and assignment operator a —= b is equivalent to a = a — b
ˆ= Bitwise exclusive OR and assignment operator a ˆ= b is equivalent to a = a ˆb

12
3.3 Operatori relat, ionali
Următorul tabel arată tot, i operatorii relat, ionali suportat, i de limbajul C s, i exemplificarea
lor utilizând variabila a (primul operand) cu valoarea 10 s, i variabila b cu valoarea 20
(al doilea operand). C evaluează toate expresiile care includ operatori relat, ionali la 0
(fals) sau 1 (adevărat).

Table 6: Operatori relat, ionali


Operator Description Example
== Checks if the values of two operands are equal. (a == b) is false
If yes, then the condition becomes true.
!= Checks if the values of two operands are not equal. (a != b) is true
If yes, then the condition becomes true.
> Checks if the value of left operand is greater than the value of right operand. (a >b) is false
If yes, then the condition becomes true.
< Checks if the value of left operand is less than the value of right operand. (a <b) is true
If yes, then the condition becomes true.
>= Checks if the value of left operand is greater than or equal to the value of right operand. (a >= b) is false
If yes, then the condition becomes true.
<= Checks if the value of left operand is less than or equal to the value of right operand. (a <= b) is true
If yes, then the condition becomes true.

3.4 Operatori logici


Următorul tabel arată tot, i operatorii logici suportat, i de limbajul C s, i exemplificarea lor
utilizând variabila a (primul operand) cu valoarea 10 s, i variabila b cu valoarea 20 (al
doilea operand). C evaluează toate expresiile care includ operatori logici la 0 (fals) sau
1 (adevărat).

Table 7: C logical operators


Operator Description Example
&& Logical AND operator (a && b) is false
If both the operands are non-zero, then the condition becomes true.
|| Logical OR operator (a || b) is true
If any of the two operands is non-zero, then the condition becomes true.
! Logical NOT operator !(a && b) is true
It is used to reverse the logical state of its operand.

13
3.5 Operatori pentru operat, ii pe bit, i
Tabelul de mai jos afis, ează tot, i operatorii bitwise suportat, i de limbajul C. Aces, ti oper-
atori lucrează pe bit, i s, i efectuează operat, ii bit-by-bit. Exemplificarea lor utilizând vari-
abila a (primul operand) cu valoarea 10 s, i variabila b cu valoarea 0 (al doilea operand)
este prezentată mai jos.

Table 8: Operatori bitwise


Operator Description Example
& Bitwise AND operator (a & b) = 0
The bits ı̂n the result are set to 1 if the corresponding bits ı̂n the two operands are both 1.
| Bitwise OR operator (a | b) = 10
The bits ı̂n the result are set to 1 if at least one of the corresponding bits ı̂n the two operands is 1.
ˆ Bitwise exclusive OR operator (a ˆb) = 10
The bits ı̂n the result are set to 1 if exactly one of the corresponding bits ı̂n the two operands is 1.
∼ Bitwise (1’s) complement operator (∼a) = -11
All 0 bits are set to 1 and all 1 bits are set to 0.
<< Left shift (a <<2) = 40
Shifts the bits of the first operand left by the number of bits specified by the second operand;
fill from the right with 0 bits.
>> Right shift (a >>2) = 2
Shifts the bits of the first operand right by the number of bits specified by the second operand;
the method of filling from the left is machine dependent.

3.6 Exemplu
Exemplul următor prezintă utilizarea operatorului S, I bitwise pentru a determina dacă
un număr ı̂ntreg este par sau impar.
# i n c l u d e < s t d i o . h>
i n t main ( ) {
int integer no = 0;

p r i n t f ( ” I n t r o d u c e t i un intreg : ” );
s c a n f ( ”%d ” , &i n t e g e r n o );
i f ( i n t e g e r n o & 1) {
p r i n t f ( ”%d e s t e impar . ” , i n t e g e r n o ) ;
}
else {
p r i n t f ( ”%d e s t e par . ” , i n t e g e r n o ) ;
}
return 0;
}

14
3.7 Operatorul conditional
Operatorul condit, ional este singurul operator ternar din C. Poate fi folosit ca o comandă
rapidă pentru o instruct, iune if ... else. Este de obicei folosit ca parte a unei expresii mai
mari ı̂n cazul ı̂n care o afirmat, ie if ... else ar fi incomodă.

Table 9: Operatorul conditional


Operator Description Example
?: If condition is true ? then value X : otherwise value Y. b = (a == 10) ? 20 : 30

3.8 Exemplu
Exemplul următor prezintă utilizarea operatorului conditional pentru a determina dacă
un număr ı̂ntreg este par sau impar.
# i n c l u d e < s t d i o . h>
i n t main ( )
{
int integer no = 0;

p r i n t f ( ” I n t r o d u c e t i un i n t r e g : ” ) ;
s c a n f ( ”%d ” , &i n t e g e r n o ) ;
( i n t e g e r n o % 2 == 0 ) ? p r i n t f ( ” P a r . ” ) : p r i n t f ( ” I m p a r . ” ) ;
return 0;
}

15
3.9 Operatorii increment/decrement
Operatorul de incrementare este utilizat pentru a cres, te valoarea unui operand cu unu s, i
operatorul de decrementare este utilizat pentru a reduce valoarea unui operand cu unu.
Operanzii pot fi prefix (operand ++) sau postfix (operand −).

Table 10: Operatorii increment/decrement


Operator Description Example
++ Increments the value of an operand by 1.
Prefix - the value after increment is used. ++a
Postfix - the value before increment is used. a++
−− Decrements the value of an operand by 1.
Prefix - the value after decrement is used. −−a
Postfix - the value before decrement is used. a−−

3.10 Exemplu
Exemplul următor prezintă utilizarea operatorilor de incrementare s, i decrementare,
prefix s, i postfix.
# i n c l u d e <s t d i o . h>
i n t main ( )
{
int a = 2 , b = 0;

b = a ++ + a −− + ++ a + −−a ;
p r i n t f ( ” Val l u i a e s t e %d s i v a l l u i b i s %d . ” , a , b ) ;
return 0;
}

3.11 Operatori speciali


Tabelul următor prezintă cât, iva operatori speciali acceptat, i de limbajul C.

Table 11: Operatori speciali


Operator Description Example
sizeof() Returns the size of a variable ı̂n bytes. sizeof(a), where a is an integer, returns 4
& Reference operator &a
Returns the address of a variable.
* Dereference operator *a
Returns the value stored at a particular address.
(type-name) Cast to type-name (float)a, where a is an integer
() Functional call
[] Array element reference

16
4 Exercit, ii
1. Care va fi rezultatul programului de mai jos?
# i n c l u d e < s t d i o . h>
i n t main ( ) {
i n t k , num = 3 0 ;

k = ( num > 5 ? ( num <= 10 ? 100 : 2 0 0 ) : 5 0 0 ) ;


p r i n t f ( ”%d \n ” , num ) ;
return 0;
}

A. 200 B. 100 C. 30 D. 500


2. Care va fi rezultatul programului de mai jos?
# i n c l u d e < s t d i o . h>
i n t main ( ) {
int i = 3 , j = 0 , k = 0;

j = 2 * ( i ++);
k = 2 * (++ i ) ;
p r i n t f ( ” i = %d j = %d k = %d ” , i , j , k ) ;
return 0;
}

A. i = 3 j = 8 k = 8 B. i = 5 j = 8 k = 10 C. i = 5 j = 6 k = 10 D. i = 4 j = 8 k = 8
3. Care va fi rezultatul programului de mai jos?
# i n c l u d e < s t d i o . h>
i n t main ( ) {
i n t x = 20 , y = 35;

x = y++ + x ++;
y = ++y + ++x ;
p r i n t f ( ” x = %d y = %d ” , x , y ) ;
return 0;
}

A. x = 58 y = 93 B. x = 57 y = 94 C. x = 56 y = 93 D. x = 57 y = 84
4. Care va fi rezultatul programului de mai jos?
# i n c l u d e < s t d i o . h>
i n t main ( ) {
int x = 5;

p r i n t f ( ” x i s %d , x << 2 i s %d , x >> 2 i s %d ” , x , x << 2 , x >> 2 ) ;

17
return 0;
}

A. x is 5 x << 2 is 21 x >> 2 is 1 B. x is 5 x << 2 is 20 x >> 2 is 1


C. x is 5 x << 2 is 19 x >> 2 is 0 D. x is 5 x << 2 is 19 x >> 2 is 1
5. Presupunând că i = 1, j = 2, k = 3 s, i m = 2, ce afis, ează fiecare dintre următoarele
instruct, iuni?
a) printf(”%d”, i == 1);
b) printf(”%d”, j == 3);
c) printf(”%d”, i >= 1 && j < 4);
d) printf(”%d”, m <= 99 && k < m);
e) printf(”%d”, j >= i || k == m);
f) printf(”%d”, k + m < j || 3 - j >= k);
g) printf(”%d”, !m );
h) printf(”%d”, !(j - m ));
i) printf(”%d”, !(k > m ));
j) printf(”%d”, !(j > k ));
6. Scriet, i un program pentru a seta bitul al n-lea al unui număr ı̂ntreg fără semn citit
de la tastatură. Utilizat, i următoarele: shift stânga 1, n ori, s, i apoi efectuat, i SAU
bitwise cu numărul ı̂ntreg nesemnat.

7. Scriet, i un program pentru a verifica dacă un an este bisect sau nu folosind opera-
torul condit, ionat. Utilizat, i următoarele: dacă un an este exact divizibil cu 4 s, i nu
este divizibil cu 100, atunci este anul bisect, altfel dacă anul este exact divizibil
cu 400, atunci este anul bisect, altfel este un an comun.

18

S-ar putea să vă placă și