Documente Academic
Documente Profesional
Documente Cultură
Manual de Programare C
Manual de Programare C
Roger Bacon
Limbajul C a fost creat la nceputul anilor '70 de ctre Brian
!ernig"am #i $ennis % Ritc"ie de la Bell Laboratories &e' (erse)* fiind
ini+ial destinat scrierii unei pr+i din sistemul de operare ,ni-. Lucrarea
/"e C 0rogramming Language a celor doi autori* aprut n mai multe
1ersiuni* a rmas cartea de referin+ n domeniu* impunnd un standard
minimal pentru orice implementare.
Caracteristicile distincti1e ale limbajului au fost clar definite de la
nceput* ele pstrndu2se n toate de31oltrile ulterioare4
5 portabilitate ma-im;
5 structurare;
5 posibilitatea efecturii opera+iilor la ni1elul ma#inii cu pstrarea
caracteristicilor unui limbaj e1oluat.
6cest manual este structurat pe 78 capitole astfel nct elementele
limbajului C s fie pre3entate ntr2o manier unitar. 0rimul capitol face o
scurt introducere #i pre3int patru programe C. ,rmtoarele nou capitole
descriu elementele limbajului C. Capitolele unspre3ece #i doispre3ece trec n
re1ist func+iile cele mai des utili3ate definite n biblioteca standard*
mpreun cu cte1a programe demonstrati1e. 6u fost selectate doar func+iile
definite de mai multe standarde 9n primul rnd 6&:; C<* pentru a garanta o
portabilitate ct mai mare.
6cest manual a fost conceput pentru a ser1i ca document care s poat
fi consultat de programatori n elaborarea proiectelor* #i nu pentru a fi
memorat. %anualul nu este o introducere n limbajul C; se presupune c
cititorul este familiari3at cu4
5 concepte de ba3 referitoare la programare4 1ariabile* instruc+iuni de
atribuire* de control al e-ecu+iei* apeluri de func+ii;
5 repre3entarea informa+iei n calculator a 1alorilor ntregi* n 1irgul
mobil* a codurilor 6:C;;;
5 opera+ii de intrare = ie#ire.
$eoarece a1em con1ingerea c cea mai bun e-plica+ie este un program
func+ional* majoritatea e-emplelor din acest manual se regsesc n fi#iere
surs C care pot fi rulate pe orice mediu de programare C #i sub orice sistem
de operare.
Ca o ultim obser1a+ie amintim recomandarea fcut de n#i#i creatorii
limbajului4 cea mai bun metod de n1+are este practica.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
?
1. Generaliti asupra limbajului C
1.1. Introducere
Limbajul C este un limbaj de programare uni1ersal* caracteri3at
printr2o e-primare concis* un control modern al flu-ului e-ecu+iei*
structuri de date* #i un bogat set de operatori.
Limbajul C nu este un limbaj de ni1el foarte nalt #i nu este
speciali3at pentru un anumit domeniu de aplica+ii. 6bsen+a
restric+iilor #i generalitatea sa l fac un limbaj mai con1enabil #i mai
eficient dect multe alte limbaje mai puternice.
Limbajul C permite scrierea de programe bine structurate*
datorit construc+iilor sale de control al flu-ului4 grupri de
instruc+iuni* luri de deci3ii 9if<* cicluri cu testul de terminare
naintea ciclului 9while* for< sau dup ciclu 9do< #i selec+ia unui
ca3 dintr2o mul+ime de ca3uri 9switch<.
Limbajul C permite lucrul cu pointeri #i are o aritmetic de
adrese puternic.
Limbajul C nu are opera+ii care prelucrea3 direct obiectele
compuse cum snt #irurile de caractere* mul+imile* listele sau
masi1ele* considerate fiecare ca o entitate. Limbajul C nu pre3int
facilit+i de alocare a memoriei altele dect defini+ia static sau
disciplina de sti1 relati1 la 1ariabilele locale ale func+iilor. @n
sfr#it* limbajul C nu are facilit+i de intrare2ie#ire #i nici metode
directe de acces la fi#iere. /oate aceste mecanisme de ni1el nalt snt
reali3ate prin func+ii e-plicite.
$e#i limbajul C este* a#adar* un limbaj de ni1el relati1 sc3ut* el
este un limbaj agreabil* e-presi1 #i elastic* care se pretea3 la o gam
larg de programe. C este un limbaj restrns #i se n1a+ relati1 u#or*
iar subtilit+ile se re+in pe msur ce e-perien+a n programare cre#te.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
A
1.2. Primele programe
@n aceast sec+iune snt pre3entate #i e-plicate patru programe cu
scopul de a asigura un suport de ba3 pentru pre3entrile din
capitolele urmtoare.
0rin tradi+ie primul program C este un mic e-emplu din lucrarea
de1enit clasic 5 /"e C programming language* de Brian
!ernig"am #i $ennis % Ritc"ie.
#include <stdio.h>
main() {
printf("Hello, world\n");
return 0;
.ipuri deri$ate
@n afar de tipurile aritmetice fundamentale* e-ist* n principiu* o
clas infinit de tipuri deri1ate* construite din tipurile fundamentale
n urmtoarele moduri4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
88
5 masive de T pentru masi1e de obiecte de un tip dat T* unde T este
unul dintre tipurile admise;
5 funcii care returneaz T pentru func+ii care returnea3 obiecte de
un tip dat T;
5 pointer la T pentru pointeri la obiecte de un tip dat T;
5 structuri pentru un #ir de obiecte de tipuri diferite;
5 reuniuni care pot con+ine obiecte de tipuri diferite* tratate ntr2o
singur 3on de memorie.
@n general aceste metode de construire de noi tipuri de obiecte
pot fi aplicate recursi1. 6mnunte despre tipurile deri1ate snt date n
sec+iunea B.?.
3.3. *biecte i $alori-st&nga
6lte dou no+iuni folosite n descrierea limbajului C snt obiectul
#i valoarea-stna.
,n obiect este con+inutul unei 3one de memorie.
D valoare-stna este o e-presie care se refer la un obiect. ,n
e-emplu e1ident de valoare-stna este un identificator. K-ist
operatori care produc 1alori2stnga4 de e-emplu* dac E este o
e-presie de tip pointer* atunci +E este o e-presie 1aloare2stnga care
se refer la obiectul pe care2l indic E. &umele valoare-stna 9n
limba engle3 left value< a fost sugerat din faptul c n e-presia de
atribuire E7 c E8 operandul stng E7 trebuie s fie o e-presie
valoare-stna. @n paragraful de descriere a operatorilor se 1a indica
dac operan3ii snt valori-stna sau dac re3ultatul opera+iei este o
valoare-stna.
3.'. Con$ersii de tip
,n numr mare de operatori pot cau3a con1ersia 1alorilor unui
operand de la un tip la altul. $ac ntr2o e-presie apar operan3i de
diferite tipuri* ei snt con1erti+i la un tip comun dup un mic numr
de reguli. @n general se fac automat numai con1ersiile care an sens*
de e-emplu4 din ntreg n flotant* ntr2o e-presie de forma f%i.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
8?
K-presii care nu au sens* ca de e-emplu un numr flotant ca indice*
nu snt admise.
Caractere i &ntregi
,n caracter poate aprea oriunde unde un ntreg este admis. @n
toate ca3urile 1aloarea caracterului este con1ertit automat ntr2un
ntreg. $eci ntr2o e-presie aritmetic tipul char #i int pot aprea
mpreun. 6ceasta permite o fle-ibilitate considerabil n anumite
tipuri de transformri de caractere. ,n astfel de e-emplu este func+ia
atoi descris n sec+iunea 7.B care con1erte#te un #ir de cifre n
ec"i1alentul lor numeric.
K-presia4
s)i* 6 !0!
produce 1aloarea numeric a caracterului 9cifr< memorat n 6:C;;.
6tragem aten+ia c atunci cnd o 1ariabil de tip char este
con1ertit la tipul int* se poate produce un ntreg negati1* dac bitul
cel mai din stnga al octetului con+ine 7. Caracterele din setul de
caractere 6:C;; nu de1in niciodat negati1e* dar anumite configura+ii
de bi+i memorate n 1ariabile de tip caracter pot aprea ca negati1e
prin e-tensia la tipul int.
Con1ersia tipului int n char se face cu pierderea bi+ilor de
ordin superior.
@ntregii de tip short snt con1erti+i automat la int. Con1ersia
ntregilor se face cu e-tensie de semn; ntregii snt totdeauna cantit+i
cu semn.
,n ntreg lon7 este con1ertit la un ntreg short sau char prin
trunc"iere la stnga; surplusul de bi+i de ordin superior se pierde.
Con$ersii #lotante
/oate opera+iile aritmetice n 1irgul mobil se e-ecut n
preci3ie e-tins. Con1ersia de la float la int se face prin
trunc"ierea pr+ii frac+ionare. Con1ersia de la int la float este
acceptat.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
8A
2ntregi #r semn
@ntr2o e-presie n care apar doi operan3i* dintre care unul
unsi7ned iar cellalt un ntreg de orice alt tip* ntregul cu semn
este con1ertit n ntreg fr semn #i re3ultatul este un ntreg fr
semn.
Cnd un int trece n unsi7ned* 1aloarea sa este cel mai mic
ntreg fr semn congruent cu ntregul cu semn 9modulo 8
7E
sau 8
?8
<.
@ntr2o repre3entare la complementul fa+ de 8 9deci pentru numere
negati1e<* con1ersia este conceptual* nu e-ist nici o sc"imbare
real a configura+iei de bi+i.
Cnd un ntreg fr semn este con1ertit la lon7* 1aloarea
re3ultatului este numeric aceea#i ca #i a ntregului fr semn* astfel
con1ersia nu face altce1a dect s adauge 3erouri la stnga.
Con$ersii aritmetice
$ac un operator aritmetic binar are doi operan3i de tipuri
diferite* atunci tipul de ni1el mai sc3ut este con1ertit la tipul de
ni1el mai nalt nainte de opera+ie. Re3ultatul este de tipul de ni1el
mai nalt. ;erar"ia tipurilor este urmtoarea4
5 char < short < int < lon7;
5 float < dou(le < lon7 dou(le;
5 tip ntreg cu semn < tip ntreg fr semn;
5 tip ntreg < 1irgul mobil.
Con$ersii prin atribuire
Con1ersiile de tip se pot face prin atribuire; 1aloarea membrului
drept este con1ertit la tipul membrului stng* care este tipul
re3ultatului.
Con$ersii logice
K-presiile rela+ionale de forma i<G #i e-presiile logice legate
prin operatorii $$ #i HH snt definite ca a1nd 1aloarea 7 dac snt
ade1rate #i 0 dac snt false.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
8B
6stfel atribuirea4
d " (c>"!0!) $$ (c<"!4!);
l face pe d egal cu 7 dac c este cifr #i egal cu 0 n ca3 contrar.
Con$ersii e"plicite
$ac con1ersiile de pn aici le2am putea considera implicite*
e-ist #i con1ersii e-plicite de tipuri pentru orice e-presie. 6ceste
con1ersii se fac prin construc+ia special numit cast de forma4
(nume-tip) expresie
@n aceast construc+ie expresie este con1ertit la tipul specificat
dup regulile preci3ate mai sus. %ai precis aceasta este ec"i1alent
cu atribuirea e-presiei respecti1e unei 1ariabile de un tip specificat* #i
aceast nou 1ariabil este apoi folosit n locul ntregii e-presii. $e
e-emplu* n e-presia4
sIrt((dou(le)n)
se con1erte#te n la dou(le nainte de a se transmite func+iei sIrt.
&otm ns c* con+inutul real al lui n nu este alterat. Dperatorul
cast are aceea#i preceden+ ca #i oricare operator unar.
3"presia constant
D e-presie constant este o e-presie care con+ine numai
constante. 6ceste e-presii snt e1aluate n momentul compilrii #i nu
n timpul e-ecu+iei; ele pot fi astfel utili3ate n orice loc unde sinta-a
cere o constant* ca de e-emplu4
#define B<;>JA@ '000
char line)B<;>JA@%'*;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
8E
'. *peratori i e"presii
Limbajul C pre3int un numr mare de operatori* caracteri3a+i
prin diferite ni1ele de prioritate sau preceden+.
@n acest capitol descriem operatorii n ordinea descresctoare a
preceden+ei lor. Dperatorii descri#i n acela#i paragraf au aceea#i
preceden+. Com specifica de fiecare dat dac asociati1itatea este la
stnga sau la dreapta.
K-presiile combin 1ariabile #i constante pentru a produce 1alori
noi #i le 1om introduce pe msur ce 1om pre3en+a operatorii.
'.1. 3"presii primare
Expresie-primar4
identificator
constant
ir
(expresie)
expresie-primar )expresie*
expresie-primar (list-expresii<opt>)
valoare-stna . identificator
expresie-primar 6> identificator
!ist-expresii4
expresie
list-expresii, expresie
,n identificator este o expresie-primar* cu condi+ia c el s fi
fost declarat corespun3tor. /ipul su este specificat n declara+ia sa.
$ac tipul unui identificator este masiv de ...* atunci 1aloarea
expresiei-identificator este un pointer la primul obiect al masi1ului*
iar tipul e-presiei este pointer la .... %ai mult* un identificator de
masi1 nu este o e-presie valoare-stna.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
87
La fel* un identificator declarat de tip funcie care
returneaz """* care nu apare pe po3i+ie de apel de func+ie este
con1ertit la pointer la funcie care returneaz """.
D constant este o expresie-primar. /ipul su poate fi int*
lon7 sau dou(le. Constantele caracter snt de tip int* constantele
flotante snt de tip lon7 dou(le.
,n #ir este o expresie-primar. /ipul su original este masiv de
caractere* dar urmnd acelea#i reguli descrise mai sus pentru
identificatori* acesta este modificat n pointer la caracter #i
re3ultatul este un pointer la primul caracter al #irului. K-ist cte1a
e-cep+ii n anumite ini+iali3ri 91e3i paragraful B.A<.
D e-presie ntre parante3e rotunde este o expresie-primar* al
crei tip #i 1aloare snt identice cu cele ale e-presiei din interiorul
parante3elor 9e-presia din parante3e poate fi #i o valoare-stna<.
D expresie-primar urmat de o e-presie ntre parante3e ptrate
este o expresie-primar. :ensul intuiti1 este de inde-are. $e obicei
expresia-primar are tipul pointer la """* expresia-indice are tipul
int* iar re3ultatul are tipul .... D e-presie de forma E7)E8* este
identic 9prin defini+ie< cu +((E7)%(E8))* unde + este operatorul
de indirectare.
,n apel de func+ie este o expresie-primar. Ka const dintr2o
expresie-primar urmat de o perec"e de parante3e rotunde* care
con+in o list-expresii separate prin 1irgule. !ista-expresii constituie
argumentele reale ale func+iei; aceast list poate fi #i 1id. Expresia-
primar trebuie s fie de tipul funcie care returneaz """* iar
re3ultatul apelului de func+ie 1a fi de tipul ....
@naintea apelului* oricare argument de tip float este con1ertit la
tipul dou(le* oricare argument de tip char sau short este
con1ertit la tipul int. &umele de masi1e snt con1ertite n pointeri la
nceputul masi1ului. &ici o alt con1ersie nu se efectuea3 automat.
$ac este necesar pentru ca tipul unui argument actual s
coincid cu cel al argumentului formal* se 1a folosi un cast 91e3i
sec+iunea ?.A<.
:nt permise apeluri recursi1e la orice func+ie.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
8G
D valoare-stna urmat de un punct #i un identificator este o
expresie-primar. #aloarea-stna denume#te o structur sau o
reuniune 91e3i capitolul 70< iar identificatorul denume#te un membru
din structur sau reuniune. Re3ultatul este o valoare-stna care se
refer la membrul denumit din structur sau reuniune.
D expresie-primar urmat de o sgeat 9constituit dintr2o
liniu+ #i semnul > urmat de un identificator este o expresie-
primar. 0rima e-presie trebuie s fie un pointer la o structur sau
reuniune* iar identificatorul trebuie s fie numele unui membru din
structura sau reuniunea respecti1. Re3ultatul este o valoare-stna
care se refer la membrul denumit din structura sau reuniunea ctre
care indic e-presia pointer.
K-presia E7>E8 este identic din punctul de 1edere al
re3ultatului cu (+E7). E8
$escriem n continuare operatorii limbajului C mpreun cu
e-presiile care se pot constitui cu ace#ti operatori.
'.2. *peratori unari
/o+i operatorii unari au aceea#i preceden+* iar e-presiile unare se
grupea3 de la dreapta la stnga.
Expresie-unar4
+ expresie
$ valoare-stna
expresie
& expresie
K expresie
%% valoare-stna
66 valoare-stna
valoare-stna %%
valoare-stna 66
(nume-tip) expresie
si:eof (nume-tip)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
8H
Dperatorul unar + este operatorul de indirectare. K-presia care2l
urmea3 trebuie s fie un pointer* iar re3ultatul este o 1aloare2stnga
care se refer la obiectul ctre care indic e-presia. $ac tipul
e-presiei este pointer la """ atunci tipul re3ultatului este .... 6cest
operator tratea3 operandul su ca o adres* face acces la ea #i i
ob+ine con+inutul.
Exemplu4 instruc+iunea 9 " +p8; atribuie lui 9 con+inutul
adresei ctre care indic p8.
Dperatorul unar $ este operatorul de ob+inere a adresei unui
obiect sau de ob+inere a unui pointer la obiectul respecti1. Dperandul
este o valoare-stna iar re3ultatul este un pointer la obiectul referit
de valoarea-stna. $ac tipul valorii-stna este ... atunci tipul
re3ultatului este pointer la """.
Exemplu. Fie 8 o 1ariabil de tip int #i p8 un pointer creat ntr2
un anumit fel 91e3i capitolul H<. 6tunci prin instruc+iunea
p8 " $8;
se atribuie 1ariabilei de tip pointer la int p8 adresa 1ariabilei 8;
putem spune acum c p8 indic spre 8. :ec1en+a4
p8 " $8; 9 " +p8;
este ec"i1alent cu
9 " 8;
Dperatorul $ poate fi aplicat numai la 1ariabile #i la elemente de
masi1. Construc+ii de forma $(8%') #i $0 nu snt admise. $e
asemenea nu se admite ca 1ariabila s fie de clas re7ister.
Dperatorul unar $ ajut la transmiterea argumentelor de tip
adres n func+ii.
Dperatorul unar 6 este operatorul de negati1are. Dperandul su
este o e-presie* iar re3ultatul este negati1area operandului. @n acest
ca3 snt aplicate con1ersiile aritmetice obi#nuite. &egati1area unui
ntreg de tip unsigned se face sc3nd 1aloarea sa din 8
n
* unde n este
numrul de bi+i re3er1a+i tipului int.
Dperatorul unar & este operatorul de negare logic. Dperandul
su este o e-presie* iar re3ultatul su este 7 sau 0 dup cum 1aloarea
operandului este 0 sau diferit de 3ero. /ipul re3ultatului este int.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
?0
6cest operator este aplicabil la orice e-presie de tip aritmetic sau la
pointeri.
Dperatorul unar K 9tilda< este operatorul de complementare la
unu. Kl con1erte#te fiecare bit 7 la 0 #i in1ers. Kl este un operator
logic pe bi+i.
Dperandul su trebuie s fie de tip ntreg. :e aplic con1ersiile
aritmetice obi#nuite.
Dperatorul unar %% este operatorul de incrementare. Dperandul
su este o 1aloare2stnga. Dperatorul produce incrementarea
operandului cu 7. 6cest operator pre3int un aspect deosebit deoarece
el poate fi folosit ca un operator prefi- 9naintea 1ariabilei4 %%n< sau
ca un operator postfi- 9dup 1ariabil4 n%%<. @n ambele ca3uri efectul
este incrementarea lui n. $ar e-presia %%n incrementea3 pe n
nainte de folosirea 1alorii sale* n timp ce n%% incrementea3 pe n
dup ce 1aloarea sa a fost utili3at. 6ceasta nseamn c n conte-tul
n care se urmre#te numai incrementarea lui n* oricare construc+ie
poate fi folosit* dar ntr2un conte-t n care #i 1aloarea lui n este
folosit %%n #i n%% furni3ea3 dou 1alori distincte.
Exemplu4 dac n este B* atunci
8 " n%% ; atribuie lui 8 1aloarea B
8 " %%n ; atribuie lui 8 1aloarea E
@n ambele ca3uri n de1ine E.
Re3ultatul opera+iei nu este o valoare-stna* dar tipul su este
tipul valorii-stna.
Dperatorul unar 66 este operatorul de decrementare. 6cest
operator este analog cu operatorul %% doar c produce decrementarea
cu 7 a operandului.
Dperatorul (nume-tip) este operatorul de con1ersie de tip. 0rin
nume-tip n+elegem unul dintre tipurile fundamentale admise n C.
Dperandul acestui operator este o expresie. Dperatorul produce
con1ersia 1alorii expresiei la tipul denumit. 6ceast construc+ie se
nume#te cast.
Dperatorul si:eof furni3ea3 dimensiunea n octe+i a
operandului su. 6plicat unui masi1 sau structuri* re3ultatul este
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
?7
numrul total de octe+i din masi1 sau structur. $imensiunea se
determin n momentul compilrii* din declara+iile obiectelor din
e-presie. :emantic* aceast e-presie este o constant ntreag care se
poate folosi n orice loc n care se cere o constant. Cea mai frec1ent
utili3are o are n comunicarea cu rutinele de alocare a memoriei sau
rutinele ;=D sistem.
Dperatorul si:eof poate fi aplicat #i unui nume-tip ntre
parante3e. @n acest ca3 el furni3ea3 dimensiunea n octe+i a unui
obiect de tipul indicat.
Construc+ia si:eof(nume-tip) este luat ca o unitate* astfel c
e-presia
si:eof(nume-tip)6.
este acela#i lucru cu
(si:eof(nume-tip))6.
'.3. *peratori multiplicati$i
Dperatorii multiplicati1i + F #i # snt operatori aritmetici
binari #i se grupea3 de la stnga la dreapta.
Expresie-multiplicativ4
expresie + expresie
expresie F expresie
expresie # expresie
Dperatorul binar + indic nmul+irea. Dperatorul este asociati1*
dar n e-presiile n care apar mai mul+i operatori de nmul+ire* ordinea
de e1aluare nu se specific. Compilatorul rearanjea3 c"iar #i un
calcul cu parante3e. 6stfel a+((+c) poate fi e1aluat ca (a+()+c.
6ceasta nu implic diferen+e* dar dac totu#i se dore#te o anumit
ordine* atunci se 1or introduce 1ariabile temporare.
Dperatorul binar F indic mpr+irea. Cnd se mpart dou
numere ntregi po3iti1e* trunc"ierea se face spre 3ero; dac unul
dintre operan3i este negati1 atunci trunc"ierea depinde de sistemul de
calcul.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
?8
Dperatorul binar # furni3ea3 restul mpr+irii primei e-presii la
cea de a doua. Dperan3ii nu pot fi de tip float. Restul are totdeauna
semnul dempr+itului. /otdeauna (aF()+(%a#( este egal cu a
9dac ( este diferit de 0<. :nt e-ecutate con1ersiile aritmetice
obi#nuite.
'.'. *peratori aditi$i
Dperatorii aditi1i % #i 6 snt operatori aritmetici binari #i se
grupea3 de la stnga la dreapta. :e e-ecut con1ersiile aritmetice
obi#nuite*
Expresie-aditiv4
expresie % expresie
expresie 6 expresie
Dperatorul binar % produce suma operan3ilor si. Kl este
asociati1 #i e-presiile care con+in mai mul+i operatori pot fi rearanjate
la fel ca n ca3ul operatorului de nmul+ire.
Dperatorul binar 6 produce diferen+a operan3ilor si.
'.). *peratori de deplasare
Dperatorii de deplasare << #i >> snt operatori logici pe bi+i.
Ki se grupea3 de la stnga la dreapta.
Expresie-deplasare4
expresie << expresie
expresie >> expresie
Dperatorul << produce deplasarea la stnga a operandului din
stnga cu un numr de po3i+ii binare dat de operandul din dreapta.
Dperatorul >> produce deplasarea la dreapta a operandului din
stnga cu un numr de po3i+ii binare dat de operandul din dreapta.
@n ambele ca3uri se e-ecut con1ersiile aritmetice obi#nuite
asupra operan3ilor* fiecare dintre ei trebuind s fie de tip ntreg.
Dperandul din dreapta este con1ertit la int; tipul re3ultatului este
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
??
cel al operandului din stnga. Re3ultatul este nedefinit dac operandul
din dreapta este negati1 sau mai mare sau egal cu lungimea
obiectului* n bi+i. 6stfel 1aloarea e-presiei E7<<E8 este E7
9interpretat ca #i configura+ie de bi+i< deplasat la stnga cu E8
po3i+ii bit; bi+ii elibera+i de1in 3ero. K-presia E7>>E8 este E7
deplasat la dreapta cu E8 po3i+ii binare. $eplasarea la dreapta este
logic 9bi+ii elibera+i de1in 0< dac E7 este de tip unsigned; altfel ea
este aritmetic 9bi+ii elibera+i de1in copii ale bitului semn<.
Exemplu4 8<<. deplasea3 pe 8 la stnga cu 8 po3i+ii* bi+ii
elibera+i de1in 0; aceasta este ec"i1alent cu multiplicarea lui 8 cu A.
'.+. *peratori relaionali
Dperatorii rela+ionali <* >* <"* >" se grupea3 de la stnga la
dreapta.
Expresie-relaional4
expresie < expresie
expresie > expresie
expresie <" expresie
expresie >" expresie
Dperatorii < 9mai mic<* > 9mai mare<* <" 9mai mic sau egal< #i
>" 9mai mare sau egal< produc 1aloarea 0 dac rela+ia specificat este
fals #i 7 dac ea este ade1rat.
/ipul re3ultatului este int. :e e-ecut con1ersiile aritmetice
obi#nuite. 6ce#ti operatori au preceden+a mai mic dect operatorii
aritmetici* astfel c e-presia i<86' se consider i<(86') a#a dup
cum ne a#teptam.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
?A
'.4. *peratori de egalitate
Expresie-ealitate4
expresie "" expresie
expresie &" expresie
Dperatorii "" 9egal cu< #i &" 9diferit de< snt analogi cu operatorii
rela+ionali* dar preceden+a lor este mai mic. 6stfel a<( "" c<d
este 7* dac a<( #i c<d au aceea#i 1aloare de ade1r.
'.5. *peratorul I pe bii
Expresie-$%4
expresie $ expresie
Dperatorul $ este operatorul $% logic pe bi+i. Kl este asociati1 #i
e-presiile care con+in operatorul $ pot fi rearanjate. Re3ultatul este
func+ia logic $% pe bi+i aplicat operan3ilor si. Dperatorul se
aplic numai la operan3i de tipuri ntregi. Legea dup care
func+ionea3 este4
V 0 7
0 0 0
7 0 7
Dperatorul $ este deseori folosit pentru a masca o anumit
mul+ime de bi+i4 de e-emplu4
c " n $ 0'33;
pune pe 3ero to+i bi+ii afar de ultimii 7 bi+i de ordin inferior ai lui n*
fr a afecta con+inutul lui n.
'.6. *peratorul SAU-exclusiv pe bii
Expresie-&A'-exclusiv4
expresie L expresie
Dperatorul L este operatorul &A'-exclusiv logic pe bi+i. Kl este
asociati1 #i e-presiile care2l con+in pot fi rearanjate. Re3ultatul este
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
?B
func+ia logic &A'-exclusiv pe bi+i aplicat operan3ilor si.
Dperatorul se aplic numai la operan3i de tipuri ntregi. Legea dup
care func+ionea3 este4
L
0 7
0 0 7
7 7 0
'.17. *peratorul SAU-inclusiv pe bii
Expresie-&A'-inclusiv4
expresie H expresie
Dperatorul H este operatorul &A'-inclusiv logic pe bi+i. Kl este
asociati1 #i e-presiile care2l con+in pot fi rearanjate. Re3ultatul este
func+ia logic &A'-inclusiv pe bi+i aplicat operan3ilor si.
Dperatorul se aplic numai la operan3i de tipuri ntregi. Legea dup
care func+ionea3 este4
H
0 7
0 0 7
7 7 7
Dperatorul H este folosit pentru a po3i+iona bi+i; de e-emplu4
8 " 8 H B<MN;
pune pe 7 to+i bi+ii din 8 care corespund la bi+i po3i+iona+i pe 7 din
B<MN. :e efectuea3 con1ersiile aritmetice obi#nuite.
'.11. *peratorul I-logic
Expresie-$%-loic4
expresie $$ expresie
Dperatorul $$ este operatorul $%-loic #i el se grupea3 de la
stnga la dreapta. Re3ultatul este 7 dac ambii operan3i snt diferi+i de
3ero #i 0 n rest. :pre deosebire de operatorul $% pe bi+i $* operatorul
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
?E
$%-loic $$ garantea3 o e1aluare de la stnga la dreapta; mai mult* al
doilea operand nu este e1aluat dac primul operand este 0.
Dperan3ii nu trebuie s aib n mod obligatoriu acela#i tip* dar
fiecare trebuie s aib unul dintre tipurile fundamentale sau pointer.
Re3ultatul este totdeauna de tip int.
'.12. *peratorul SAU-logic
Expresie-&A'-loic4
expresie HH expresie
Dperatorul HH este operatorul &A'-loic #i el se grupea3 de la
stnga la dreapta. Re3ultatul este 7 dac cel pu+in unul dintre operan3i
este diferit de 3ero #i 0 n rest.
:pre deosebire de operatorul &A'-inclusiv pe bi+i H* operatorul
&A'-loic HH garantea3 o e1aluare de la stnga la dreapta; mai mult*
al doilea operand nu este e1aluat dac 1aloarea primului operand este
diferit de 3ero.
Dperan3ii nu trebuie s aib n mod obligatoriu acela#i tip* dar
fiecare trebuie s aib unul dintre tipurile fundamentale sau pointer.
Re3ultatul este totdeauna de tip int.
'.13. *peratorul condiional
Expresie-condiional4
expresie O expresie 4 expresie
Dperatorul condi+ional O este un operator ternar. 0rima e-presie
se e1aluea3 #i dac ea este diferit de 3ero sau ade1rat* re3ultatul
este 1aloarea celei de2a doua e-presii* altfel re3ultatul este 1aloarea
e-presiei a treia. $e e-emplu e-presia4
: " (a>() O a P (;
calculea3 ma-imul dintre a #i ( #i l atribuie lui :. :e e1aluea3 mai
nti prima e-presie a>(. $ac ea este ade1rat se e1aluea3 a doua
e-presie #i 1aloarea ei este re3ultatul opera+iei* aceast 1aloare se
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
?7
atribuie lui :. $ac prima e-presie nu este ade1rat atunci : ia
1aloarea lui (.
K-presia condi+ional poate fi folosit peste tot unde sinta-a cere
o e-presie.
$ac este posibil* se e-ecut con1ersiile aritmetice obi#nuite
pentru a aduce e-presia a doua #i a treia la un tip comun; dac ambele
e-presii snt pointeri de acela#i tip* re3ultatul are #i el acela#i tip;
dac numai o e-presie este un pointer* cealalt trebuie sa fie
constanta 0* iar re3ultatul este de tipul pointerului. @ntotdeauna numai
una dintre e-presiile a doua #i a treia este e1aluat.
$ac f este flotant #i n ntreg* atunci e-presia
(h>0)O f P n
este de tip double indiferent dac n este po3iti1 sau negati1.
0arante3ele nu snt necesare deoarece preceden+a operatorului OP
este mai mic* dar ele pot fi folosite pentru a face e-presia
condi+ional mai 1i3ibil.
'.1'. *peratori de atribuire
K-ist mai mul+i operatori de atribuire* care se grupea3 to+i de la
dreapta la stnga. Dperandul stng este o 1aloare2stnga* operandul
drept este o e-presie. /ipul e-presiei de atribuire este tipul
operandului stng.
Re3ultatul este 1aloarea memorat n operandul stng dup ce
atribuirea a a1ut loc. Cele dou pr+i ale unui operator de atribuire
compus snt unit+i le-icale 9simboluri< distincte.
Expresie-atribuire4
valoare-stna " expresie
valoare-stna op" expresie
unde op poate fi unul din operatorii %* 6* +* F* #* <<* >>* $* L* H.
@ntr2o atribuire simpl cu "* 1aloarea e-presiei nlocuie#te pe cea
a obiectului referit de valoare-stna. $ac ambii operan3i au tip
aritmetic* atunci operandul drept este con1ertit la tipul operandului
stng nainte de atribuire.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
?G
K-presiile de forma E7 op" E8 se interpretea3 ca fiind
ec"i1alente cu e-presiile de forma E7 " E7 op E8; totu#i E7 este
e1aluat o singur dat.
Exemplu4 e-presia 8 +" 9%' este ec"i1alent cu
8 " 8 + (9%') #i nu cu 8 " 8 + 9 % '
0entru operatorii %" #i 6"* operandul stng poate fi #i un pointer*
n care ca3 operandul din dreapta este con1ertit la ntreg 91e3i
capitolul H<. /o+i operan3ii din dreapta #i to+i operan3ii din stnga care
nu snt pointeri trebuie s fie de tip aritmetic.
6tribuirea prescurtat este a1antajoas n ca3ul cnd n membrul
stng a1em e-presii complicate* deoarece ele se e1aluea3 o singur
dat.
'.1). *peratorul $irgul
Expresie-virul4
expresie , expresie
D perec"e de e-presii separate prin 1irgul se e1aluea3 de la
stnga la dreapta #i 1aloarea e-presiei din stnga se neglijea3. /ipul
#i 1aloarea re3ultatului snt cele ale operandului din dreapta. 6ce#ti
operatori se grupea3 de la stnga la dreapta. @n conte-tele n care
1irgula are un sens special* 9de e-emplu ntr2o list de argumente
reale ale unei func+ii #i lista de ini+iali3are<* operatorul 1irgul descris
aici poate aprea numai n parante3e. $e e-emplu func+ia4
f(a,(t"0,t%.),c)
are trei argumente* dintre care al doilea are 1aloarea B. K-presia
acestui argument este o e-presie 1irgul. @n calculul 1alorii lui se
e1aluea3 nti e-presia din stnga #i se ob+ine 1aloarea ? pentru t*
apoi cu aceast 1aloare se e1aluea3 a doua e-presie #i se ob+ine t=B.
0rima 1aloare a lui t se pierde.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
?H
'.1+. Precedena i ordinea de e$aluare
/abelul de la sfr#itul acestei sec+iuni constituie un re3umat al
regulilor de preceden+ #i asociati1itate ale tuturor operatorilor.
Dperatorii din aceea#i linie au aceea#i preceden+; liniile snt
scrise n ordinea descresctoare a preceden+ei* astfel de e-emplu
operatorii +* F #i # au to+i aceea#i preceden+* care este mai mare
dect aceea a operatorilor % #i 6.
$up cum s2a men+ionat deja* e-presiile care con+in unul dintre
operatorii asociati1i sau comutati1i 9+* %* $* L* H< pot fi rearanjate de
compilator c"iar dac con+in parante3e. @n cele mai multe ca3uri
aceasta nu produce nici o diferen+; n ca3urile n care o asemenea
diferen+ ar putea aprea pot fi utili3ate 1ariabile temporare e-plicite*
pentru a for+a ordinea de e1aluare.
Limbajul C* ca #i multe alte limbaje* nu specific n ce ordine snt
e1alua+i operan3ii unui operator. $e e-emplu ntr2o instruc+iune de
forma4
8 " f() % 7();
f poate fi e1aluat nainte sau dup e1aluarea lui 7; dac f sau 7
alterea3 o 1ariabil e-tern de care cealalt depinde* 8 poate
depinde de ordinea de e1aluare. $in nou re3ultate intermediare
trebuie memorate n 1ariabile temporare pentru a asigura o sec1en+
particular.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
A0
Dperator 6sociati1itate
() )* 6> .
stnga la dreapta
& %% 66 6 (tip) + $ si:eof dreapta la stnga
+ F #
stnga la dreapta
% 6
stnga la dreapta
<< >>
stnga la dreapta
< <" > >"
stnga la dreapta
"" &"
stnga la dreapta
$
stnga la dreapta
L
stnga la dreapta
H
stnga la dreapta
$$
stnga la dreapta
HH
stnga la dreapta
OP
dreapta la stnga
" op" dreapta la stnga
,
stnga la dreapta
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
A7
). 8eclaraii
$eclara+iile se folosesc pentru a specifica interpretarea pe care
compilatorul trebuie s o dea fiecrui identificator.
(eclaraie4
specificator-declaraie lista-declarator<opt>;
&pecificator-declaraie4
specificator-tip specificator-declaraie<opt>
specificator-clas-memorie specificator-declaraie<opt>
&pecificator-tip4
char
short
int
lon7
unsi7ned
float
dou(le
-oid
specificator-structur-sau-reuniune
t9pedef-nume
&pecificator-clas-memorie4
auto
static
e8tern
re7ister
const
t9pedef
!ista-declarator4
declarator-cu-iniializare
declarator-cu-iniializare* lista-declarator
(eclarator-cu-iniializare4
declarator iniializator<opt>
(eclarator4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
A8
identificator
(declarator)
+ declarator
declarator ()
declarator )expresie-constant<opt>*
$eclara+iile listea3 toate 1ariabilele care urmea3 a fi folosite
ntr2un program. D declara+ie specific tipul* clasa de memorie #i
e1entual 1alorile ini+iale pentru una sau mai multe 1ariabile de
acela#i tip. $eclara+iile se fac sau n afara oricrei func+ii sau la
nceputul unei func+ii naintea oricrei instruc+iuni.
&u orice declara+ie re3er1 #i memorie pentru un anumit
identificator* de aceea deosebim4
declara+ia de defini+ie a unei 1ariabile* care se refer la locul
unde este creat 1ariabila #i unde i se aloc memorie;
declara+ia de utili3are a unei 1ariabile* care se refer la locul
unde numele 1ariabilei este declarat pentru a anun+a propriet+ile
1ariabilei care urmea3 a fi folosit.
).1. ,peci#icatori de clas de memorie
:pecificatorii de clas de memorie snt4
auto static e8tern re7ister
const t9pedef
:pecificatorul t9pedef nu re3er1 memorie #i este denumit
specificator de clas de memorie numai din moti1e sintactice; el 1a
fi discutat n capitolul 70.
:emnifica+ia diferitelor clase de memorie a fost discutat deja n
paragraful ?.7.
$eclara+iile cu specificatorii auto* static #i re7ister
determin #i re3er1area unei 3one de memorie corespun3toare.
$eclara+ia cu specificatorul e8tern presupune o defini+ie e-tern
pentru identificatorii da+i* unde1a n afara func+iei sau fi#ierului n
care ei snt declara+i.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
A?
@ntr2o declara+ie poate s apar cel mult un specificator de clas
de memorie. $ac specificatorul de clas lipse#te din declara+ie* el se
consider implicit auto n interiorul unei func+ii #i defini+ie e-tern n
afara func+iei. K-cep+ie fac func+iile care nu snt niciodat
automatice. $e e-emplu liniile4
int sp;
dou(le -al)B<;Q<>*;
care apar ntr2un program n afara oricrei func+ii* definesc
1ariabilele e-terne sp de tip int #i -al de tip masi1 de dou(le.
Kle determin alocarea memoriei #i ser1esc de asemenea ca declara+ii
ale acestor 1ariabile n tot restul fi#ierului surs. 0e de alt parte
liniile4
e8tern int sp;
e8tern dou(le -al)*;
declar pentru restul fi#ierului surs c 1ariabilele sp #i -al snt
e-terne* sp este de tip int #i -al este un masi1 de dou(le #i c
ele au fost definite n alt parte* unde li s2a alocat #i memorie. $eci
aceste declara+ii nu creea3 aceste 1ariabile #i nici nu le aloc
memorie.
).2. ,peci#icatori de tip
:pecificatorii de tip snt4
char short int lon7 unsi7ned
float dou(le -oid
specificator-structur-sau-reuniune
t9pedef2nume
Cu1intele lon7* short #i unsi7ned pot fi considerate #i ca
adjecti1e; urmtoarele combina+ii snt acceptate4
short int
lon7 int
unsi7ned int
unsi7ned lon7 int
lon7 dou(le
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
AA
@ntr2o declara+ie se admite cel mult un specificator de tip* cu
e-cep+ia combina+iilor amintite mai sus. $ac specificatorul de tip
lipse#te din declara+ie* el se consider implicit int.
:pecificatorii de structuri #i reuniuni snt pre3enta+i n
sec+iunea 70.H* iar declara+iile cu t9pedef n sec+iunea
70.70.
).3. 8eclaratori
!ista-declarator care apare ntr2o declara+ie este o succesiune de
declaratori separa+i prin 1irgule* fiecare dintre ei putnd a1ea un
ini+iali3ator.
$eclaratorii din lista-declarator snt identificatorii care trebuie
declara+i.
Fiecare declarator este considerat ca o afirma+ie care* atunci cnd
apare o construc+ie de aceea#i form cu declaratorul* produce un
obiect de tipul #i de clasa de memorie indicat. Fiecare declarator
con+ine un singur identificator. Lruparea declaratorilor este la fel ca
#i la e-presii.
$ac declaratorul este un identificator simplu* atunci el are tipul
indicat de specificatorul din declara+ie.
,n declarator ntre parante3e este tot un declarator* dar legtura
declaratorilor complec#i poate fi alterat de parante3e.
: considerm acum o declara+ie de forma4
T (7
unde T este un specificator de tip 9ca de e-emplu int< #i (7 un
declarator. : presupunem c aceast declara+ie face ca identificatorul
s aib tipul ...T unde ... este 1id dac (7 este un identificator
simplu 9a#a cum tipul lui 8 n int 8 este int<. $ac (7 are forma4
+(
atunci tipul identificatorului pe care2l con+ine acest declarator este
pointer la T.
$ac (7 are forma4
(()
atunci identificatorul pe care2l con+ine are tipul funcie care
returneaz T.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
AB
$ac (7 are forma4
()expresie-constant* sau ()*
atunci identificatorul pe care2l con+ine are tipul masiv de T.
@n primul ca3 e-presia constant este o e-presie a crei 1aloare
este determinabil la compilare #i al crei tip este int. Cnd mai
mul+i identificatori masiv de T snt adiacen+i* se creea3 un masi1
multidimensional; e-presiile constante care specific marginile
masi1elor pot lipsi numai pentru primul membru din sec1en+.
6ceast omisiune este util cnd masi1ul este e-tern #i defini+ia real
care aloc memoria este n alt parte 91e3i sec+iunea B.7<. 0rima
e-presie constant poate lipsi de asemenea cnd declaratorul este
urmat de ini+iali3are. @n acest ca3 dimensiunea este calculat la
compilare din numrul elementelor ini+iale furni3ate.
,n masi1 poate fi construit din obiecte de unul dintre tipurile de
ba3* din pointeri* din reuniuni sau structuri* sau din alte masi1e
9pentru a genera un masi1 multidimensional<.
&u toate posibilit+ile admise de sinta-a de mai sus snt permise.
Restric+iile snt urmtoarele4 func+iile nu pot returna masi1e*
structuri* reuniuni sau func+ii* de#i ele pot returna pointeri la astfel de
obiecte; nu e-ist masi1e de func+ii* dar pot fi masi1e de pointeri la
func+ii. $e asemenea* o structur sau reuniune nu poate con+ine o
func+ie* dar ea poate con+ine un pointer la func+ie. $e e-emplu*
declara+ia
int i, +ip, f(), +fip(), (+pfi)();
declar un ntreg i* un pointer ip la un ntreg* o func+ie f care
returnea3 un ntreg* o func+ie fip care returnea3 un pointer la un
ntreg* un pointer pfi la o func+ie care returnea3 un ntreg. 0re3int
interes compararea ultimilor doi declaratori.
Construc+ia +fip() este +(fip())* astfel c declara+ia
sugerea3 apelul func+iei fip #i apoi utili3nd indirectarea prin
intermediul pointerului se ob+ine un ntreg.
@n declaratorul (+pfi)()* parante3ele e-terne snt necesare
pentru arta c indirectarea printr2un pointer la o func+ie furni3ea3 o
func+ie* care este apoi apelat; ea returnea3 un ntreg.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
AE
$eclara+iile de 1ariabile pot fi e-plicite sau implicite prin
conte-t. $e e-emplu declara+iile4
int a,(,c;
char d, m)'00*;
specific un tip #i o list de 1ariabile. 6ici clasa de memorie nu este
declarat e-plicit* ea se deduce din conte-t. $ac declara+ia este
fcut n afara oricrei func+ii atunci clasa de memorie este e8tern;
dac declara+ia este fcut n interiorul unei func+ii atunci implicit
clasa de memorie este auto.
Cariabilele pot fi distribuite n declara+ii n orice mod; astfel
listele le mai sus pot fi scrise #i sub forma4
int a;
int (;
int c;
char d;
char m)'00*;
6ceasta ultim form ocup mai mult spa+iu dar este mai
con1enabil pentru adugarea unui comentariu pentru fiecare
declara+ie sau pentru modificri ulterioare.
).'. Modi#icatorul const
Caloarea unei 1ariabile declarate cu acest modificator nu poate fi
modificat.
:inta-a4
const nume-variabil " valoare ;
nume-funcie (...* const tip +nume-variabil* ...)
@n prima 1ariant* modificatorul atribuie o 1aloare ini+ial unei
1ariabile care nu mai poate fi ulterior modificat de program. $e
e-emplu*
const int -irsta " 04;
Drice atribuire pentru 1ariabila -irsta 1a genera o eroare de
compilare.
6ten+ieR D 1ariabil declarat cu const poate fi indirect
modificat prin intermediul unui pointer4
int +p " $-irsta;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
A7
+p " 01;
@n a doua 1ariant modificatorul const este folosit mpreun
cu un parametru pointer ntr2o list de parametri ai unei func+ii.
Func+ia nu poate modifica 1ariabila pe care o indic pointerul4
int printf (const char +format, ...);
).). Iniiali1are
,n declarator poate specifica o 1aloare ini+ial pentru
identificatorul care se declar. ;ni+iali3atorul este precedat de semnul
" #i const dintr2o e-presie sau o list de 1alori incluse n acolade.
%niializator4
expresie
{list-iniializare
!ist-iniializare4
expresie
list-iniializare, list-iniializare
{list-iniializare
/oate e-presiile dintr2un iniializator pentru 1ariabile statice sau
e-terne trebuie s fie e-presii constante 91e3i sec+iunea ?.A< sau
e-presii care se reduc la adresa unei 1ariabile declarate anterior*
posibil offset2ul unei e-presii constante. Cariabilele de clas auto sau
register pot fi ini+iali3ate cu e-presii oarecare* nu neaprat e-presii
constante* care implic constante sau 1ariabile declarate anterior sau
c"iar func+ii.
@n absen+a ini+iali3rii e-plicite* 1ariabilele statice #i e-terne snt
ini+iali3ate implicit cu 1aloarea 0. Cariabilele auto #i register au 1alori
ini+iale nedefinite 9re3iduale<.
0entru 1ariabilele statice #i e-terne* ini+iali3area se face o singur
dat* n principiu nainte ca programul s nceap s se e-ecute.
0entru 1ariabilele auto #i re7ister* ini+iali3area este fcut
la fiecare intrare n func+ie sau bloc.
$ac un ini+iali3ator se aplic unui scalar 9un pointer sau un
obiect de tip aritmetic< el const dintr2o singur e-presie* e1entual n
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
AG
acolade. Caloarea ini+ial a obiectului este luat din e-presie; se
efectuea3 acelea#i opera+ii ca n ca3ul atribuirii.
0entru ini+iali3area masi1elor #i masi1elor de pointeri 1e3i
sec+iunea H.G. 0entru ini+iali3area structurilor 1e3i sec+iunea 70.?.
$ac masi1ul sau structura con+ine sub2masi1e sau sub2structuri
regula de ini+iali3are se aplic recursi1 la membrii masi1ului sau
structuri.
).+. Nume-tip
@n cele e-puse mai sus furni3area unui nume-tip a fost necesar n
dou conte-te4
pentru a specifica con1ersii e-plicite de tip prin intermediul unui
cast 91e3i sec+iunea ?.A<;
ca argument al lui si:eof 91e3i sec+iunea A.8<.
,n nume-tip este n esen+ o declara+ie pentru un obiect de acest
tip* dar care omite numele obiectului.
)ume-tip4
specificator-tip declarator-abstract
(eclarator-abstract4
vid
(declarator-abstract)
+declarator-abstract
declarator-abstract()
declarator-abstract)expresie-constant<opt>*
0entru a e1ita ambiguitatea* n construc+ia4
(declarator-abstract)
declaratorul abstract se presupune a nu fi 1id. Cu aceast restric+ie*
este posibil s identificm n mod unic locul ntr2un declarator-
abstract* unde ar putea aprea un identificator* dac aceast
construc+ie a fost un declarator ntr2o declara+ie. 6tunci tipul denumit
este acela#i ca #i tipul identificatorului ipotetic. $e e-emplu4
int
int+
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
AH
int +)0*
int(+))0*
int +( )
int(+)()
denume#te respecti1 tipurile int* pointer la ntre* masiv de ?
pointeri la ntrei* pointer la un masiv de ? ntrei* funcie care
returneaz pointer la ntre #i pointer la o funcie care returneaz
ntre.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
B0
+. Instruciuni
@ntr2un program scris n limbajul C instruc+iunile se e-ecut
sec1en+ial* n afar de ca3ul n care se indic altfel.
;nstruc+iunile pot fi scrise cte una pe o linie pentru o li3ibilitate
mai bun* dar nu este obligatoriu.
+.1. Instruciunea expresie
Cele mai multe instruc+iuni snt instruc+iuni expresie. D e-presie
de1ine instruc+iune dac ea este urmat de punct #i 1irgul.
Format4
expresie;
$e obicei instruc+iunile expresie snt atribuiri sau apeluri de
func+ie; de e-emplu4
8 " 0;
printf(...);
@n limbajul C punct #i 1irgula este un terminator de instruc+iune
#i este obligatoriu.
+.2. Instruciunea compus sau blocul
;nstruc+iunea compus este o grupare de declara+ii #i instruc+iuni
nc"ise ntre acolade. Kle au fost introduse cu scopul de a folosi mai
multe instruc+iuni acolo unde sinta-a cere o instruc+iune.
;nstruc+iunea compus sau blocul snt ec"i1alente sintactic cu o
singur instruc+iune.
Format4
%nstruciune-compus4
{ list-declaratori<opt> list-instruciuni<opt>
!ist-declaratori4
declaraie
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
B7
declaraie list-declaratori
!ist-instruciuni4
instruciune
instruciune list-instruciuni
$ac anumi+i identificatori din lista-declaratori au fost declara+i
anterior* atunci declara+ia e-terioar este sal1at pe durata blocului*
dup care #i reia sensul su.
Drice ini+iali3are pentru 1ariabile auto #i re7ister se
efectuea3 la fiecare intrare n bloc. ;ni+iali3rile pentru 1ariabilele
static se e-ecut numai o singur dat cnd programul ncepe s
se e-ecute.
,n bloc se termin cu o acolad dreapt care nu este urmat
niciodat de punct #i 1irgul.
+.3. Instruciunea condiional
:inta-a instruc+iunii condi+ionale admite dou formate4
if (expresie)
instruciune27
if (expresie)
instruciune27
else instruciune28
;nstruc+iunea condi+ional se folose#te pentru a lua deci3ii. @n
ambele ca3uri se e1aluea3 e-presia #i dac ea este ade1rat 9deci
diferit de 3ero< se e-ecut instruc+iune27. $ac e-presia este fals
9are 1aloarea 3ero< #i instruc+iunea if are #i parte de else atunci se
e-ecut instruc+iune28.
,na #i numai una dintre cele dou instruc+iuni se e-ecut.
$eoarece un if testea3 pur #i simplu 1aloarea numeric a unei
e-presii* se admite o prescurtare #i anume4
if (expresie)
n loc de4
if (expresie &" 0)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
B8
$eoarece partea else a unei instruc+iuni if este op+ional*
e-ist o ambiguitate cnd un else este omis dintr2o sec1en+ de if
imbricat. 6ceasta se re3ol1 asociind else cu ultimul if care nu
are else.
Exemplu4
if (n>0)
if (a>()
: " a;
else
: " (;
0artea else apar+ine if2ului din interior. $ac nu dorim acest
lucru atunci folosim acoladele pentru a for+a asocierea4
if (n>0) {
if (a>()
: " a;
else
: " (;
;nstruc+iunea condi+ional admite #i construc+ia else2if de forma4
if (expresie27)
instruciune27
else if (expresie28)
instruciune28
else if (expresie2?)
instruc+iune2?
else
instruciune2A
6ceast sec1en+ de if se folose#te frec1ent n programe* ca
mod de a e-prima o deci3ie multipl.
K-presiile se e1aluea3 n ordinea n care apar; dac se ntlne#te
o e-presie ade1rat* atunci se e-ecut instruc+iunea asociat cu ea #i
astfel se termin ntregul lan+.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
B?
Dricare instruc+iune poate fi o instruc+iune simpl sau un grup de
instruc+iuni ntre acolade.
d ;nstruc+iunea dup ultimul else se e-ecut n ca3ul n care nici
o e-presie nu a fost ade1rat.
$ac n acest ca3 nu e-ist nici o ac+iune e-plicit de fcut*
atunci partea
else instruciune2A
poate s lipseasc.
Func+ia (inar9 din sec+iunea 7.B este un e-emplu de deci3ie
multipl de ordinul ?.
0ot e-ista un numr arbitrar de construc+ii4
else if (expresie)
instruciune
grupate ntre un if ini+ial #i un else final.
@ntotdeauna un else se leag cu ultimul if ntlnit.
+.'. Instruciunea while
Format4
while (expresie)
instruciune
;nstruc+iunea se e-ecut repetat atta timp ct 1aloarea e-presiei
este diferit de 3ero. /estul are loc naintea fiecrei e-ecu+ii a
instruc+iunii. 0rin urmare ciclul este urmtorul4 se testea3 condi+ia
din parante3e dac ea este ade1rat* deci e-presia din parante3e are
o 1aloare diferit de 3ero* se e-ecut corpul instruc+iunii while* se
1erific din nou condi+ia* dac ea este ade1rat se e-ecut din nou
corpul instruc+iunii. Cnd condi+ia de1ine fals* adic 1aloarea
e-presiei din parante3e este 3ero* se face un salt la instruc+iunea de
dup corpul instruc+iunii while* deci instruc+iunea while se
termin.
+.). Instruciunea do
Format4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
BA
do instruciune while
(expresie);
;nstruc+iunea se e-ecut repetat pn cnd 1aloarea e-presiei
de1ine 3ero. /estul are loc dup fiecare e-ecu+ie a instruc+iunii.
+.+. Instruciunea for
Format4
for (expresie27<opt>; expresie28<opt>; expresie2?<opt>)
instruciune
6ceast instruc+iune este ec"i1alent cu4
expresie27;
while (expresie28) {
instruciune;
expresie2?;
main() {
int i;
for (i"0; i<'0; %%i)
printf(" #d #d\n", i, power(.,i),
power(60,i));
main() {
=W imprim toate liniile care con+in cu1ntul the W=
char line )B<;>JA@*;
while (7etline(line, B<;>JA@)>0)
if (inde8(line,"the")>"0)
printf("#s",line);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EG
B. Func+ia (inar9 reali3ea3 cutarea 1alorii 8 ntr2un masi1
sortat -* care are n elemente.
(inar9(int 8, int -)*, int n) {
=W caut 8 n -
0
* -
'
* ...* -
n6'
W=
int low, hi7h, mid;
low " 0;
hi7h " n 6 ';
while (low<"hi7h) {
mid " (low % hi7h) F .;
if (8 < -)mid*)
hi7h " mid 6 ';
else if (8 > -)mid*)
low " mid % ';
else =W s2a gsit o intrare W=
return(mid);
return 6';
int main() {
unsi7ned p,I,,;
citire($p);
citire($I);
,"cmmdc(p,I);
printf("DmmdcP #u\n",,);
return 0;
/estul if (allocp%n<"alloc(uf%<>>SDMJT@)
1erific dac e-ist spa+iu suficient pentru satisfacerea cererii de
alocare a n caractere. $ac cererea poate fi satisfcut* alloc re1ine
cu un pointer la 3ona de n caractere consecuti1e. $ac nu* alloc
trebuie s semnale3e lipsa de spa+iu pe care o face returnnd 1aloarea
constantei simbolice A?>>. Limbajul C garantea3 c nici un pointer
care indic corect o dat nu 1a con+ine 3ero* prin urmare o re1enire
cu 1aloarea 3ero poate fi folosit pentru semnalarea unui e1eniment
anormal 9n ca3ul nostru* lipsa de spa+iu<. 6tribuirea 1alorii 3ero unui
pointer este deci un ca3 special.
Dbser1m de asemenea c 1ariabilele alloc(uf #i allocp
snt declarate static cu scopul ca ele s fie locale numai fi#ierului
surs care con+ine func+iile alloc #i free.
K-emplul de mai sus demonstrea3 cte1a din facilit+ile
aritmeticii de adrese 9pointeri<. @n primul rnd* pointerii pot fi
compara+i n anumite situa+ii. $ac p #i I snt pointeri la membri
unui acela#i masi1* atunci rela+iile <* <"* >* >"* ""* &" snt
1alide. Rela+ia p<I* de e-emplu* este ade1rat dac p indic un
element mai apropiat de nceputul masi1ului dect elementul indicat
de pointerul I. Comparrile ntre pointeri pot duce ns la re3ultate
impre1i3ibile* dac ei se refer la elemente apar+innd la masi1e
diferite.
:e obser1 c pointerii #i ntregii pot fi aduna+i sau sc3u+i.
Construc+ia de forma4
p%n
nseamn adresa celui de2al n2lea element dup cel indicat de p*
indiferent de tipul elementului pe care l indic p. Compilatorul C
alinia3 1aloarea lui n conform dimensiunii elementelor pe care le
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
G8
indic p* dimensiunea fiind determinat din declara+ia lui p 9scara de
aliniere este 7 pentru char* 8 pentru int etc<.
$ac p #i I indic elemente ale aceluia#i masi1* p6I este
numrul elementelor dintre cele pe care le indic p #i I. : scriem o
alt 1ersiune a func+iei strlen folosind aceast ultim obser1a+ie4
strlen(char +s) { =W returnea3 lungimea unui #ir W=
char +p;
p " s;
while (+p &" !\0!)
p%%;
return p6s;
$eoarece 1ariabila leap poate lua ca 1alori numai 3ero sau unu
dup cum e-presia4
(9ear#/""0) $$ (9ear#'00&"0) HH
(9ear#/00""0)
este fals sau ade1rat* ea poate fi folosit ca indice de linie n
tabelul da9Uta( care are doar dou linii n e-emplul nostru.
monthUda9(int 9ear, int 9earda9,
int +pmonth, int +pda9) {
int i,leap;
leap " (9ear#/""0) $$ (9ear#'00&"0) HH
(9ear#/00""0);
for (i"'; 9earda9>da9Uta()leap*)i*; i%%)
9earda9 6" da9Uta()leap*)i*;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
G7
+pmonth " i;
+pda9 " 9earda9;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
HG
6ceast 1ersiune arat c argumentul func+iei printf poate fi o
e-presie ca oricare alta* cu toate c acest mod de utili3are nu este
foarte frec1ent.
Ca un al doilea e-emplu* s reconsiderm programul din
sec+iunea 7.B* care imprim fiecare linie a unui te-t care con+ine un
#ir specificat de caractere 9sc"em<.
$orim acum ca aceast sc"em s poat fi modificat dinamic*
de la e-ecu+ie la e-ecu+ie. 0entru aceasta o specificm printr2un
argument n linia de comand.
bi atunci programul care caut sc"ema dat de primul argument
al liniei de comand este4
#define B<;>JA@ '000
main(int ar7c, char +ar7-) *) {
=W gse#te sc"ema din primul argument W=
char line)B<;>JA@*;
if (ar7c&".)
printf(">inia de comanda eronata\n");
else
while (7etline(line,B<;>JA@)>0)
if (inde8(line,ar7-)'*)>"0)
printf("#s",line);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
70B
17. ,tructuri i reuniuni
D structur este o colec+ie de una sau mai multe 1ariabile* de
acela#i tip sau de tipuri diferite* grupate mpreun sub un singur
nume pentru a putea fi tratate mpreun 9n alte limbaje* structurile se
numesc articole<.
:tructurile ajut la organi3area datelor complicate* n special n
programele mari* deoarece permit unui grup de 1ariabile legate s fie
tratate ca o singur entitate. Com ilustra n acest capitol modul de
utili3are a structurilor.
17.1. 3lemente de ba1
: re1enim asupra rutinei de con1ersie a datei pre3entat n
capitolul H.
D dat const din 3i* lun #i an* e1entual numrul 3ilei din an #i
numele lunii. 6ceste cinci 1ariabile pot fi grupate ntr2o singur
structur astfel4
struct date {
int da9;
int month;
int 9ear;
int 9earda9;
char monUname)/*;
;
Cu1ntul c"eie struct introduce o declara+ie de structur care
este o list de declara+ii nc"ise n acolade.
Cu1ntul struct poate fi urmat op+ional de un nume* numit
marcaj de structur sau etic"et de structur* cum este n e-emplul
nostru numele date. 6cest marcaj denume#te acest tip de structur
#i poate fi folosit n continuare ca o prescurtare pentru declara+ia de
structur detaliat creia i este asociat.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
70E
Klementele sau 1ariabilele men+ionate ntr2o structur se numesc
membri ai structurii. ,n membru al structurii sau o etic"et #i o
1ariabil oarecare* nemembru* pot a1ea acela#i nume fr a genera
conflicte* deoarece ele 1or fi ntotdeauna deosebite una de alta din
conte-t.
6colada dreapt care nc"eie o list de membri ai unei structuri
poate fi urmat de o list de 1ariabile* la fel ca #i n ca3ul tipurilor de
ba3. $e e-emplu4
struct {. . . 8,9,:;
este din punct de 1edere sintactic analog cu4
int 8,9,:;
n sensul c fiecare declara+ie declar pe 8* 9 #i : ca 1ariabile de
tipul numit 9structur n primul ca3 #i ntreg n al doilea< #i cau3ea3
alocarea de spa+iu pentru ele.
D declara+ie de structur care nu este urmat de o list de
1ariabile nu aloc memorie; ea descrie numai un #ablon* o form de
structur. $ac structura este marcat sau etic"etat* atunci marcajul
ei poate fi folosit mai tr3iu pentru definirea unor alte 1ariabile de tip
structur* cu acela#i #ablon ca structura marcat. $e e-emplu* fiind
dat declara+ia4
struct date d;
ea define#te 1ariabila d* ca o structur de acela#i fel 9#ablon< ca
structura date.
D structur e-tern sau static poate fi ini+iali3at* ata#nd dup
defini+ia ei o list de ini+iali3atori pentru componente* de e-emplu4
struct date d " {/,3,'45/,'51,"iulie";
,n membru al unei structuri este referit printr2o e-presie de
forma4
nume-structur.membru
n care operatorul membru de structur a.a leag numele membrului
de numele structurii. Ca e-emplu fie atribuirea4
leap " (d.9ear#/""0) $$ (d.9ear#'00&"0)
HH (d.9ear#/00""0);
sau 1erificarea numelui lunii4
if (strcmp(d.monUname,"au7ust")""0) ...
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
707
:tructurile pot fi imbricate; o nregistrare de stat de plat* de
e-emplu* poate fi de urmtoarea form4
struct person {
char name)A<B@MJT@*;
char address)<EVMJT@*;
lon7 :ipcode;
lon7 ssUnum(er;
dou(le salar9;
struct date (irthdate;
struct date hiredate;
;
:tructura person con+ine dou structuri de #ablon date.
$eclara+ia4
struct person emp;
define#te #i aloc o structur cu numele emp de acela#i #ablon ca #i
person. 6tunci4
emp.(irthdate.month
se refer la luna de na#tere. Dperatorul de membru de structur a.a
este asociati1 de la stnga la dreapta.
17.2. ,tructuri i #uncii
K-ist un numr de restric+ii asupra structurilor n limbajul C.
:ingurele opera+ii care se pot aplica unei structuri snt accesul la un
membru al structurii #i considerarea adresei ei cu ajutorul
operatorului $. 6cest lucru implic faptul c structurile nu pot fi
atribuite sau copiate ca entit+i #i c ele nu pot fi transmise ca
argumente la func+ii #i nici returnate din func+ii. :tructurile de clas
automatic* ca #i masi1ele de aceea#i clas* nu pot fi ini+iali3ate; pot fi
ini+iali3ate numai structurile e-terne #i statice* regulile de ini+iali3are
fiind acelea#i ca pentru masi1e.
0ointerii la structuri nu se supun ns acestor restric+ii* moti1
pentru care structurile #i func+iile pot coe-ista #i conlucra prin
intermediul pointerilor.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
70G
Ca un e-emplu* s rescriem programul de con1ersie a datei* care
calculea3 3iua anului* din lun #i 3i.
da9UofU9ear(struct date +pd) {
=W calculul 3ilei anului W=
int i, da9, leap;
da9 " pd6>da9;
leap " (pd6>9ear#/""0) $$
(pd6>9ear#'00&""0) HH
(pd6>9ear#/00""0);
for (i"'; i<pd6>month; i%%)
da9 %" da9Uta()leap*)i*;
return da9;
$eclara+ia4
struct date + pd;
indic faptul c pd este un pointer la o structur de #ablonul lui date.
&ota+ia4
pd6>9ear
indic faptul c se refer membrul S9earS al acestei structuri. @n
general* dac p este un pointer la o structur p6>membru-structur
se refer la un membru particular 9operatorul a6>a se formea3 din
semnul minus urmat de semnul mai mare<.
$eoarece pd este pointer la o structur* membrul )ear poate fi de
asemenea referit prin4
(+pd).9ear
&ota+ia S6>S se impune ca un mod con1enabil de prescurtare. @n
nota+ia (+pd).9ear* parante3ele snt necesare deoarece preceden+a
operatorului membru de structur a.a este mai mare dect cea a
operatorului +.
6mbii operatori a.a #i a6>a snt asociati1i de la stnga la dreapta*
astfel nct4
p6>I6>membru
emp.(irthdate.month
snt de fapt4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
70H
(p6>I)6>membru
(emp.(irthdate).month
Dperatorii a6>a #i a.a ai structurilor* mpreun cu () pentru
listele de argumente #i )* pentru inde-are se gsesc n 1rful listei de
preceden+ 91e3i sec+iunea A.7E<* fiind din acest punct de 1edere
foarte apropia+i. 6stfel* fiind dat declara+ia4
struct {
int 8;
int +9; +p;
unde p este un pointer la o structur* atunci e-presia4
%%p6>8
incrementea3 pe 8* nu pointerul p* deoarece operatorul a6>a are o
preceden+ mai mare dect a%%a. 0arante3ele pot fi folosite pentru a
modifica ordinea operatorilor dat de preceden+a. 6stfel4
(%%p)6>8
incrementea3 mai nti pe p #i apoi accesea3 elementul 8* din
structura nou pointat.
@n e-presia (p%%)6>8 se accesea3 mai nti 8* apoi se
incrementea3 pointerul p.
@n mod analog* +p6>9 indic con+inutul adresei pe care o indic
9. K-presia +p6>9%% accesea3 mai nti ceea ce indic 9 #i apoi
incrementea3 pe 9. K-presia (+p6>9)%% incrementea3 ceea ce
indic 9. K-presia +p%%6>9 accesea3 ceea ce indic 9 #i apoi
incrementea3 pointerul p.
17.3. Masi$e de structuri
:tructurile snt n mod special utile pentru tratarea masi1elor de
1ariabile legate prin conte-t. 0entru e-emplificare 1om considera un
program care numr intrrile fiecrui cu1nt c"eie dintr2un te-t.
0entru aceasta a1em ne1oie de un masi1 de #iruri de caractere* pentru
pstrarea numelor cu1intelor c"eie #i un masi1 de ntregi pentru a
memora numrul apari+iilor. D posibilitate este de a folosi dou
masi1e paralele ,e9word #i ,e9count declarate prin4
char +,e9word)AN@WM*;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
770
int ,e9count)AN@WM*;
respecti1 unul de pointeri la #iruri de caractere #i cellalt de ntregi.
Fiecrui cu1nt c"eie i corespunde perec"ea4
char +,e9word;
int ,e9count;
astfel nct putem considera cele dou masi1e ca fiind un masi1 de
perec"i. 6tunci* declara+ia de structur4
struct ,e9 {
char +,e9word;
int ,e9count;
,e9ta()AN@WM*;
define#te un masi1 ,e9ta( de structuri de acest tip #i aloc memorie
pentru ele. Fiecare element al masi1ului ,e9ta( este o structur de
acela#i #ablon ca #i structura ,e9.
$efini+ia masi1ului ,e9ta( poate fi scris #i sub forma4
struct ,e9 {
char +,e9word;
int ,e9count;
;
struct ,e9 ,e9ta()AN@WM*;
$eoarece masi1ul de structuri ,e9ta( con+ine* n ca3ul nostru*
o mul+ime constant de cu1inte c"eie* este mai u#or de ini+iali3at o
dat pentru totdeauna c"iar n locul unde este definit. ;ni+iali3area
structurilor este o opera+ie analoag cu ini+iali3area unui masi1 n
sensul c defini+ia este urmat de o list de ini+iali3atori nc"i#i n
acolade.
6tunci ini+iali3area masi1ului de structuri ,e9ta( 1a fi
urmtoarea4
struct ,e9 {
char + ,e9word;
int ,e9count;
,e9ta()* " {
"(rea,",0,
"case",0,
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
777
"char",0,
=W ... W=
"while",0;
;ni+iali3atorii snt perec"i care corespund la membrii structurii.
;ni+iali3area ar putea fi fcut #i inclu3nd ini+iali3atorii fiecrei
structuri din masi1 n acolade ca n4
{"(rea,",0,{"case",0....
dar parante3ele interioare nu snt necesare dac ini+iali3atorii snt
1ariabile simple sau #iruri de caractere #i dac to+i ini+iali3atorii snt
pre3en+i.
Compilatorul 1a calcula* pe ba3a ini+iali3atorilor* dimensiunea
masi1ului de structuri ,e9ta( moti1 pentru care* la ini+iali3are* nu
este necesar indicarea dimensiunii masi1ului.
0rogramul de numrare a cu1intelor c"eie ncepe cu definirea
masi1ului de structuri ,e9ta(. Rutina principal main cite#te
te-tul de la intrare prin apel repetat la o func+ie 7etword* care
e-trage din intrare cte un cu1nt la un apel. Fiecare cu1nt este apoi
cutat n tabelul ,e9ta( cu ajutorul unei func+ii de cutare
(inar9* descris n sec+iunea 7.B. Lista cu1intelor c"eie trebuie s
fie n ordine cresctoare pentru ca func+ia (inar9 s lucre3e corect.
$ac cu1ntul cercetat este un cu1nt c"eie atunci func+ia (inar9
returnea3 numrul de ordine al cu1ntului n tabelul cu1intelor c"eie*
altfel returnea3 7.
#define B<;XSVE .0
(inar9(char +word, struct ,e9 ta()*,
int n) {
int low,hi7h,mid,cond;
low " 0;
hi7h " n 6 ';
while (low<"hi7h) {
mid "(low % hi7h) F .;
if (
(cond"strcmp(word,ta()mid*.,e9word))
<0)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
778
hi7h " mid 6 ';
else
if (cond>0) low " mid % ';
else
return mid;
return 6';
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
77H
Rutina main gestionea3 fiecare cu1nt din intrare ncepnd cu
cel mai nalt ni1el al arborelui 9rdcina<. La fiecare pas* cu1ntul din
intrare este comparat cu cu1ntul asociat rdcinii #i este apoi
transmis n jos* fie descendentului stng* fie celui drept* printr2un apel
recursi1 la rutina tree. @n acest proces* cu1ntul fie e-ist deja*
unde1a n arbore* ca3 n care contorul lui de numrare a apari+iilor se
incrementea3* fie cutarea continu pn la ntlnirea unui pointer
A?>>* ca3 n care nodul trebuie creat #i adugat arborelui. Cnd se
creea3 un nod nou* rutina tree returnea3 un pointer la el* care
apoi este introdus n nodul de origine 9adic n nodul al crui
descendent este noul nod< n cmpul left sau ri7ht dup cum
noul cu1nt este mai mic sau mai mare fa+ de cu1ntul origine.
Rutina tree* care returnea3 un pointer la o structur de #ablon
tnode are urmtorul cod4
struct tnode +tree(struct tnode +p,
char +w) { =W introduce cu1ntul ' n nodul p W=
struct tnode +talloc(int n);
char +strsa-(char +s);
int cond;
if (p""A?>>) { =W a sosit un nou cu1nt W=
p " talloc(); =W creea3 un nod nou W=
p6>word " strsa-(w);
p6>count " ';
p6>left " p6>ri7ht " A?>>;
else
if ((cond"strcmp(w,p6>word))""0)
p6>count%%;
else
if (cond<0) =W noul cu1nt mai mic W=
p6>left " tree(p6>left,w);
else =W noul cu1nt mai mare W=
p6>ri7ht " tree(p6>ri7ht,w);
return p;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
780
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
788
17.+. Cutare &n tabele
D alt problem legat de definirea #i utili3area structurilor este
cutarea n tabele. Cnd se ntlne#te de e-emplu* o linie de forma4
#define W@M '
simbolul W@M #i te-tul de substitu+ie 7 se memorea3 ntr2o tabel.
%ai tr3iu* ori de cte ori te-tul W@M 1a aprea n instruc+iuni* el se 1a
nlocui cu constanta 7.
Crearea #i gestionarea tabelelor de simboluri este o problem de
ba3 n procesul de compilare. K-ist dou rutine principale care
gestionea3 simbolurile #i te-tele lor de substitu+ie. 0rima*
install(s,t) nregistrea3 simbolul s #i te-tul de substitu+ie t
ntr2o tabel* s #i t fiind #iruri de caractere. 6 doua* loo,up(s)
caut #irul s n tabel #i returnea3 fie un pointer la locul unde a fost
gsit* fie A?>> dac #irul s nu figurea3 n tabel.
6lgoritmul folosit pentru crearea #i gestionarea tabelei de
simboluri este o cutare pe ba3 de "as"ing. Fiecrui simbol i se
calculea3 un cod "as" astfel4 se adun codurile 6:C;; ale
caracterelor simbolului #i se ia restul pro1enit din mpr+irea
numrului ob+inut din adunare #i dimensiunea tabelului. 6stfel*
fiecrui simbol i se asocia3 un cod "as" H care 1erific rela+ia4
0<"H<08'00 9n "e-a3ecimal<
Codul "as" astfel ob+inut 1a fi folosit apoi ca un indice ntr2o
tabel de pointeri. ,n element al acestei tabele 9masi1< indic
nceputul unui lan+ de blocuri care descriu simboluri cu acela#i cod
"as". $ac un element al tabelei este A?>> nseamn c nici un
simbol nu are 1aloarea respecti1 de "as"ing.
,n bloc dintr2un lan+ indicat de un element al tabelei este o
structur care con+ine un pointer la simbol* un pointer la te-tul de
substitu+ie #i un pointer la urmtorul bloc din lan+. ,n pointer A?>>
la urmtorul bloc din lan+ indic sfr#itul lan+ului.
bablonul unei structuri 9nod< este urmtorul4
struct nlist {
char +name;
char +def;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
78?
struct nlist +ne8t;= W urmtoarea intrare n lan+ W=
;
/abelul de pointeri care indic nceputurile lan+ului de blocuri ce
descriu simboluri de acela#i cod "as" este4
#define H<MHMJT@ 08'00
static struct nlist +hashta()H<MHMJT@*;
6lgoritmul de "as"ing pe care2l pre3entm nu este cel mai bun
posibil* dar are meritul de a fi e-trem de simplu4
hash(char +s) {
=W formea3 1aloarea "as" pentru #irul s W=
int hash-al;
for (hash-al"0; +s&"!\0!;)
hash-al %" +s%%;
return hash-al # H<MHMJT@;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
78A
Rutina install folose#te func+ia loo,up pentru a determina
dac simbolul nou care trebuie introdus n lan+ este deja pre3ent sau
nu. $ac mai e-ist o defini+ie anterioar pentru acest simbol* ea
trebuie nlocuit cu defini+ia nou. 6ltfel* se creea3 o intrare nou
pentru acest simbol* care se introduce la nceputul lan+ului. Func+ia
install returnea3 A?>>* dac din anumite moti1e nu e-ist
suficient spa+iu pentru crearea unui bloc unu.
struct nlist +install(char +name, char
+def) { =W scrie 9nume* def< n hta( W=
struct nlist +np, +loo,up();
char +strsa-(), +alloc();
int hash-al;
if ((np"loo,up(name))""A?>>) { =W nu s2a gsit W=
np " (struct nlist+)alloc(si:eof(+np));
if (np""A?>>)
return A?>>; =W nu e-ist spa+iu W=
if ((np6>name"strsa-(name))""A?>>)
return A?>>;
hash-al " hash(np6>name);
np6>ne8t " hashta()hash-al*;
hashta()hash-al* " np;
else =W nodul e-ist deja W=
free(np6>def); =W eliberea3 defini+ia 1ec"e W=
if ((np6>def"strsa-(def))""A?>>)
return A?>>;
return np;
17.4. C&mpuri
,n cmp se define#te ca fiind o mul+ime de bi+i consecuti1i dintr2
un cu1nt sau ntreg. 6dic din moti1e de economie a spa+iului de
memorie* este util mpac"etarea unor obiecte ntr2un singur cu1nt
ma#in. ,n ca3 frec1ent de acest tip este utili3area unui set de flaguri*
fiecare pe un bit* pentru tabela de simboluri a unui compilator.
Fiecare simbol dintr2un program are anumite informa+ii asociate
lui* cum snt de e-emplu* clasa de memorie* tipul* dac este sau nu
cu1nt c"eie #.a.m.d. Cel mai compact mod de a codifica aceste
informa+ii este folosirea unui set de flaguri* de cte un bit* ntr2un
singur ntreg sau caracter.
%odul cel mai u3ual pentru a face acest lucru este de a defini un
set de m#ti* fiecare masc fiind corespun3toare po3i+iei bitului m
interiorul caracterului sau cu1ntului. $e e-emplu4
#define N@WXSVE 0'
#define @;R@VA<> 0.
#define MR<RJD 0/
definesc m#tile N@WXSVE* @;R@VA<> #i MR<RJD care se refer la
bi+ii 0* 7 #i respecti1 8 din caracter sau cu1nt. 6tunci accesarea
acestor bi+i se reali3ea3 cu ajutorul opera+iilor de deplasare* mascare
#i complementare* descri#i ntr2un capitol anterior. &umerele trebuie
s fie puteri ale lui 8.
K-presii de forma4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
787
fla7s H " @;R@VA<> H MR<RJD;
apar frec1ent #i ele setea3 bi+ii 7 #i 8 din caracterul sau ntregul
fla7s 9n e-emplul nostru<
n timp ce e-presia4
fla7s $" (@;R@VA<> H MR<RJD);
selectea3 bi+ii 7 #i 8 din flags.
K-presia4
if (fla7s $ (@;R@VA<> H MR<RJD)) ...
este ade1rat cnd cel pu+in unul din bi+ii 7 sau 8 din flags este unu.
K-presia4
if (&(fla7s $ (@;R@VA<> H MR<RJD))) ...
este ade1rat cnd bi+ii 7 #i 8 din flags snt ambii 3ero.
Limbajul C ofer aceste e-presii* ca o alternati1* pentru
posibilitatea de a defini #i de a accesa bi+ii dintr2un cu1nt* n mod
direct* folosind operatorii logici pe bi+i.
:inta-a defini+iei cmpului #i a accesului la el se ba3ea3 pe
structuri. $e e-emplu construc+iile #define din e-emplul de mai
sus pot fi nlocuite prin definirea a trei cmpuri4
struct {
unsi7ned isU,e9wordP ';
unsi7ned isUe8ternalP';
unsi7ned isUstaticP ';
fla7s;
6ceast construc+ie define#te 1ariabila fla7s care con+ine ?
cmpuri* fiecare de cte un bit. &umrul care urmea3 dup aPa
repre3int lungimea cmpului n bi+i. Cmpurile snt declarate
unsi7ned pentru a sublinia c ele snt cantit+i fr semn. 0entru a
ne referi la un cmp indi1idual din 1ariabila fla7s folosim o nota+ie
similar cu nota+ia folosit pentru membrii structurilor.
fla7s.isU,e9word
fla7s.isUstatic
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
78G
Cmpurile se comport ca ni#te ntregi mici fr semn #i pot
participa n e-presii aritmetice ca orice al+i ntregi. 6stfel* e-presiile
anterioare pot fi scrise mai natural sub forma urmtoare4
fla7s.isUe8tern " fla7s.isUstatic " ';
pentru setarea bi+ilor 7 #i 8 din 1ariabila fla7s*
fla7s.isUe8tern " fla7s.isUstatic " 0;
pentru #tergerea bi+ilor* iar4
if (fla7s.isUe8tern""0 $$
fla7s.isUstatic""0)
pentru testarea lor.
,n cmp nu trebuie s dep#easc limitele unui cu1nt. @n ca3
contrar* cmpul se alinia3 la limita urmtorului cu1nt. Cmpurile nu
necesit s fie denumite. ,n cmp fr nume* descris numai prin
caracterul aPa #i lungimea lui n bi+i este folosit pentru a re3er1a
spa+iu n 1ederea alinierii urmtorului cmp. Lungimea 3ero a unui
cmp poate fi folosit pentru for+area alinierii urmtorului cmp la
limita unui nou cu1nt* el fiind presupus a con+ine tot cmpuri #i nu
un membru obi#nuit al structuri* deoarece n acest ultim ca3* alinierea
se face n mod automat. &ici un cmp nu poate fi mai lung dect un
cu1nt. Cmpurile se atribuie de la dreapta la stnga.
Cmpurile nu pot constitui masi1e* nu au adrese* astfel nct
operatorul '$' nu se poate aplica asupra lor.
17.5. ;euniuni
D reuniune este o 1ariabil care poate con+ine* la momente
diferite* obiecte de diferite tipuri #i dimensiuni; compilatorul este cel
care +ine e1iden+a dimensiunilor #i aliniamentului.
Reuniunile ofer posibilitatea ca mai multe tipuri diferite de date
s fie tratate ntr2o singur 3on de memorie* fr a folosi n program
1reo informa+ie dependent de ma#in.
: relum e-emplul tabelei de simboluri a unui compilator*
presupunnd c constantele pot fi de tip int* float sau #iruri de
caractere.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
78H
Caloarea unei constante particulare trebuie memorat ntr2o
1ariabil de tip corespun3tor* cu toate c este mai con1enabil* pentru
gestiunea tabelei de simboluri* ca 1aloarea s fie memorat n aceea#i
3on de memorie* indiferent de tipul ei #i s ocupe aceea#i cantitate
de memorie. 6cesta este scopul unei reuniuni4 de a furni3a o singur
1ariabil care s poat con+ine oricare dintre 1alorile unor tipuri de
date. Ca #i n ca3ul cmpurilor* sinta-a defini+iei #i accesului la o
reuniune se ba3ea3 pe structuri. Fie defini+ia4
union uUta7. { int i-al;
float f-al;
char +p-al;
u-al;
Cariabila u-al 1a fi suficient de mare ca s poat pstra pe cea
mai mare dintre cele trei tipuri de componente. Dricare dintre tipurile
de mai sus poate fi atribuit 1ariabilei u-al #i apoi folosit n e-presii
n mod corespun3tor* adic tipul n u-al este tipul ultim atribuit.
,tili3atorul este cel care +ine e1iden+a tipului curent memorat ntr2o
reuniune.
:intactic* membrii unei reuniuni snt accesibili printr2o
construc+ie de forma4
nume-reuniune. membru
sau
pointer-la-reuniune6>membru
$ac 1ariabila ut9pe este utili3at pentru a +ine e1iden+a tipului
curent memorat n u-al* atunci fie urmtorul cod4
if (ut9pe""JAR)
printf ("#d\n",u-al.i-al);
else if (ut9pe"" =>S<R)
printf("#f\n",u-al.f-al);
else if (ut9pe""MRVJAY)
printf("#s\n",u-al.p-al);
else
printf("tip incorect #d in ut9pe\n",
ut9pe);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7?0
Reuniunile pot aprea n structuri #i masi1e #i in1ers. :inta-a
pentru accesarea unui membru al unei reuniuni* dintr2o structur* sau
in1ers este identic cu cea pentru structurile imbricate. 0e e-emplu*
n masi1ul de structuri s9mta()AMWB* definit de4
struct {
char + name;
int fla7s;
int ut9pe;
union {
int i-al;
float f-al;
char +p-al;
u-al;
s9mta()AMWB*;
1ariabila i-al se refer prin4
s9mta()i*.u-al.i-al
iar primul caracter al #irului pointat de p-al prin4
+s9mta()i*.u-al.p-al
$e fapt* o reuniune este o structur n care to+i membrii au
deplasamentul 3ero* structura fiind suficient de mare pentru a putea
pstra pe cel mai mare membru. 6linierea este corespun3toare
pentru toate tipurile reuniunii. Ca #i la structuri* singurele opera+ii
permise cu reuniuni snt accesul la un membru al reuniunii #i
considerarea adresei ei.
Reuniunile nu pot fi atribuite* transmise la func+ii sau returnate
de ctre acestea. 0ointerii la reuniuni pot fi folosi+i n mod similar cu
pointerii la structuri.
17.6. 8eclaraii de structuri> reuniuni i c&mpuri
$eoarece specificatorii de structuri* reuniuni #i cmpuri au
aceea#i form 1om pre3enta sinta-a lor general n acest paragraf.
&pecificator-structur-sau-reuniune4
struct-sau-union { lista-declaraiilor
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7?7
struct-sau-union identificator { lista-declaraiilor
struct-sau-union identificator
&truct-sau-union4
struct
union
Lista2declara+iilor este o sec1en+ de declara+ii pentru membrii
structurii sau reuniunii.
!ista-declaraiilor4
declaraie-structur
declaraie-structur, lista-declaraiilor
(eclaraie-structur4
specificator-tip, lista-declarator;
!ista-declarator4
declarator-structur
declarator-structur, lista-declarator
@n mod obi#nuit* un declarator2structur este c"iar un declarator
pentru un membru al structurii sau reuniunii. ,n membru al structurii
poate fi constituit dintr2un numr specificat de bi+i* ca3 n care a1em
de2a face cu un cmp. Lungimea lui se separ de nume prin caracterul
aPa 6tunci4
(eclarator-structur4
declarator
declarator P expresie-constant
P expresie-constant
@ntr2o structur fiecare membru care nu este un cmp ncepe la o
adres corespun3toare tipului su. 6stfel ntr2o structur pot e-ista
3one fr nume neutili3ate* re3ultate din moti1e de aliniere.
Limbajul C nu introduce restric+ii pri1ind tipurile obiectelor care
pot fi declarate cmpuri.
,n specificator2structur2sau2reuniune de forma a doua declar
un identificator ca fiind etic"eta 9marcajul< structurii sau reuniunii.
6tunci o declara+ie ulterioar poate folosi forma a treia a unui
specificator2structur2sau2reuniune.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7?8
Ktic"etele de structuri permit definirea structurilor auto2referite;
de asemenea permit ca partea de declara+ie a corpului structurii s fie
dat o singur dat #i folosit de mai multe ori. Kste inter3is
declararea recursi1 a unei structuri sau reuniuni* dar o structur sau
o reuniune poate con+ine un pointer la ea.
$ou structuri pot partaja o sec1en+ ini+ial comun de membri;
adic acela#i membru poate aprea n dou structuri diferite dac el
are acela#i tip n ambele structuri #i dac to+i membri preceden+i lui
snt identici n cele dou structuri.
17.17. Typedef
Limbajul C ofer o facilitate numit t)pedef pentru a crea noi
nume de tipuri de date. :pecificatorul de tip t)pedef2nume are
sinta-a4
typedef-nume4
declarator
@ntr2o declara+ie implicnd t9pedef fiecare identificator care
apare ca parte a unui declarator de1ine sintactic ec"i1alent cu
cu1ntul c"eie re3er1at pentru tipul asociat cu identificatorul. $e
e-emplu* declara+ia4
t9pedef int >@AYRH;
l face pe >@AYRH sinonim cu int. /ipul >@AYRH poate fi folosit
ulterior n declara+ii n acela#i mod ca #i tipul int.
>@AYRH len, ma8len;
>@AYRH +len7th)*;
@n mod similar* declara+ia4
t9pedef char +MRVJAY;
l face pe MRVJAY sinonim cu char+* adic pointer la caracter* care
apoi poate fi utili3at n declara+ii de tipul4
MRVJAY p, lineptr)>JA@M*, alloc();
:e obser1 c tipul care se declar prin t9pedef apare pe
po3i+ia numelui de 1ariabil nu imediat dup cu1ntul re3er1at
t9pedef. :intactic t9pedef este sinonim cu clasele de memorie
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7??
e8tern* static etc* dar nu re3er1 memorie pentru 1ariabilele
respecti1e.
Ca un e-emplu mai complicat s relum declara+ia unui nod al
unui arbore* de data aceasta folosind t9pedef pentru a crea un nou
nume pentru un tip structur 91e3i sec+iunea 70.B<.
t9pedef struct tnode {
char +word; =W pointer la te-t W=
int count; =W numr apari+ii W=
struct tnode +left; =W descendent stng W=
struct tnode +ri7ht; =W descendent drept W=
RV@@ASE@, +RV@@ZRV;
6ceast declara+ie creea3 dou nume noi de tipuri* numite
RV@@ASE@* care este o structur #i RV@@ZRV* care este un pointer la
o structur. 6tunci rutina talloc poate fi scris sub forma4
RV@@ZRV talloc() {
char +alloc();
return (RV@@ZRV)alloc(si:eof(RV@@ASE@)));
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7BH
12. :lte rutine din biblioteca standard
@n acest capitol snt descrise func+ii care re3ol1 probleme legate
de alocarea dinamic a memoriei* sortare #i cutare* clasificare*
opera+ii cu blocuri de memorie #i #iruri de caractere* func+ii
matematice.
12.1. :locarea dinamic a memoriei
&ume
calloc* malloc* realloc 2 aloc memoria n mod
dinamic
free 2 eliberea3 memoria alocat n mod dinamic
$eclara+ie
#include <stdli(.h>
-oid +calloc(unsi7ned nel, unsi7ned si:e);
-oid +malloc(unsi7ned si:e);
-oid +realloc(-oid +ptr, unsi7ned si:e);
-oid free(-oid +ptr);
$escriere
Func+ia calloc aloc memorie pentru un tablou de nel
elemente* fiecare de mrime si:e octe+i #i returnea3 un pointer la
memoria alocat. Con+inutul memoriei este pus la 3ero.
Func+ia malloc aloc si3e octe+i #i returnea3 un pointer la
memoria alocat. Con+inutul memoriei nu este #ters.
Func+ia free eliberea3 spa+iul de memorie indicat de ptr* care
trebuie s fi fost returnat de un apel anterior malloc* calloc sau
realloc. @n ca3 contrar* sau dac a e-istat deja un apel anterior
free(ptr)* comportamentul programului este impre1i3ibil.
Func+ia realloc sc"imb mrimea blocului de memorie indicat
de ptr la si:e octe+i. Con+inutul rmne nesc"imbat la mrimea
minim dintre mrimea 1ec"e #i cea nou; noul spa+iu de memorie
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7E0
care este e1entual alocat este neini+iali3at. $ac ptr este A?>>
apelul este ec"i1alent cu malloc(si:e); dac si:e este egal cu
3ero apelul este ec"i1alent cu free(ptr). Cu e-cep+ia ca3ului cnd
ptr este A?>>* acesta trebuie s fi fost returnat de un apel precedent
malloc* calloc sau realloc.
Calori returnate
0entru calloc #i malloc 1aloarea returnat este un pointer la
memoria alocat* care este aliniat n mod corespun3tor pentru orice
tip de 1ariabile* sau A?>> dac nu e-ist suficient memorie
continu.
Func+ia free nu returnea3 nimic.
Func+ia realloc returnea3 un pointer la noua 3on de
memorie alocat* care este aliniat n mod corespun3tor pentru orice
tip de 1ariabile* #i poate fi diferit de ptr* sau poate fi A?>> dac nu
e-ist suficient memorie continu sau dac 1aloarea si:e este
egal cu 0. $ac realloc e#uea3* blocul original rmne neatins 2
nu este nici eliberat nici mutat.
12.2. ,ortare i cutare
&ume
*sort 2 sortea3 un tablou
bsearch 2 cutare binar ntr2un tablou sortat
$eclara+ie
#include <stdli(.h>
-oid Isort(-oid +(ase, unsi7ned nel,
unsi7ned si:e, int (+comp)
(const -oid +, const -oid +));
-oid +(search(const -oid +,e9, const -oid
+(ase, unsi7ned nel, unsi7ned si:e, int
(+comp)(const -oid +, const -oid +));
$escriere
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7E7
Func+ia Isort sortea3 un tablou de nel elemente* fiecare de
mrime si:e. 6rgumentul (ase indic spre nceputul tabloului.
Klementele tabloului snt sortate n ordine cresctoare n
concordan+ cu func+ia de comparare referit de comp* apelat cu
dou argumente care indic spre obiectele ce se compar. Func+ia de
comparare trebuie s returne3e un ntreg mai mic dect* egal cu* sau
mai mare dect 3ero dac primul argument este considerat a fi mai
mic dect* egal cu* respecti1 mai mare dect al doilea. $ac cele dou
elemente comparate snt egale* ordinea n tabloul sortat este
nedefinit.
Func+ia (search caut ntr2un tablou de nel elemente* fiecare
de mrime si:e* un membru care coincide cu obiectul indicat de
,e9. 6rgumentul (ase indic spre nceputul tabloului.
Con+inutul tabloului trebuie s fie sortat cresctor n concordan+
cu func+ia de comparare referit de comp* apelat cu dou argumente
care indic spre obiectele ce se compar. Func+ia de comparare
trebuie s returne3e un ntreg mai mic dect* egal cu* sau mai mare
dect 3ero dac primul argument este considerat a fi mai mic dect*
egal cu* respecti1 mai mare dect al doilea.
Caloare returnat
Func+ia (search returnea3 un pointer la un membru al
tabloului care coincide cu obiectul indicat de ,e9* sau A?>> dac nu
se gse#te nici un membru. $ac e-ist mai multe elemente care
coincid cu ,e9* poate fi returnat oricare element cu aceast
proprietate.
12.3. ;utine de clasi#icare
&ume
isalnum* isalpha* isascii* iscntrl* isdigit*
isgraph* islower* isprint* ispunct* isspace*
isupper* isxdigit 2 rutine de clasificare
tolower 2 con1ersie n liter mic
toupper 2 con1ersie n liter mare
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7E8
$eclara+ie
#include <ct9pe.h>
int isalnum(int c); int islower(int c);
int isalpha(int c); int isprint(int c);
int isascii(int c); int ispunct(int c);
int iscntrl(int c); int isspace(int c);
int isdi7it(int c); int isupper(int c);
int is7raph(int c); int is8di7it(int c);
int tolower(int c); int toupper(int c);
$escriere
0rimele 78 func+ii 1erific dac c* care trebuie s fie o 1aloare de
tip unsi7ned char sau @S=* se afl n una din clasele de caractere
enumerate mai sus.
isalnum
Cerific dac c este alfanumeric; este ec"i1alent cu
(isalpha(c) HH isdi7it(c)).
isalpha
Cerific dac c este alfabetic; este ec"i1alent cu (isupper(c)
HH islower(c)).
isascii
Cerific dac c este o 1aloare pe 7 bi+i din setul de caractere
6:C;;.
iscntrl
Cerific dac c este un caracter de control.
isdi7it
Cerific dac c este o cifr 9ntre 0 #i H<.
is7raph
Cerific dac c este un caracter afi#abil cu e-cep+ia spa+iului.
islower
Cerific dac c este o liter mic.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7E?
isprint
Cerific dac c este un caracter afi#abil inclusi1 spa+iu.
ispunct
Cerific dac c este un caracter diferit de spa+iu #i non2
alfanumeric.
isspace
Cerific dac c este un spa+iu alb.
isupper
Cerific dac c este o liter mare.
is8di7it
Cerific dac c este o cifr "e-a3ecimal din setul 0 7 8 ? A B E 7
G H a b c d e f 6 B C $ K F.
tolower
Con1erte#te caracterul c* dac este o liter* la litera mic
corespun3toare.
toupper
Con1erte#te caracterul c* dac este o liter* la litera mare
corespun3toare.
Caloare returnat
Caloarea returnat de func+iile is... este nenul dac caracterul c
se afl n clasa testat* #i 3ero n ca3 contrar.
Caloarea returnat de func+iile to... este litera con1ertit dac
caracterul c este o liter* #i nedefinit n ca3 contrar.
12.'. *peraii cu blocuri de memorie
0entru majoritatea func+iilor din aceast categorie compilatorul
e-pandea3 codul acestora folosind instruc+iuni pe #iruri de caractere.
$eclara+iile acestor func+ii se ob+in cu
#include <strin7.h>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7EA
&ume
memcpy 2 copia3 o 3on de memorie
$eclara+ie
-oid +memcp9(-oid +dest, const -oid +src,
unsi7ned n);
-oid +memmo-e(-oid +dest, const -oid +src,
unsi7ned n);
$escriere
Func+ia memcp9 copia3 n octe+i din 3ona de memorie src n
3ona de memorie dest. Qonele de memorie nu trebuie s se
suprapun. $ac e-ist acest risc se utili3ea3 memmo-e.
Caloare returnat
Func+iile returnea3 un pointer la dest.
&ume
memcmp 2 compar dou 3one de memorie
$eclara+ie
int memcmp(const -oid +s', const -oid +s.,
unsi7ned n);
$escriere
Func+ia memcmp compar primii n octe+i ai 3onelor de memorie
s' #i s..
Caloare returnat
Returnea3 un ntreg mai mic dect* egal cu* sau mai mare dect
3ero dac s' este mai mic dect* coincide* respecti1 este mai mare
dect s..
&ume
memset 2 umple o 3on de memorie cu o constant pe un
octet
$eclara+ie
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7EB
-oid +memset(-oid +s, int c, unsi7ned n);
$escriere
Func+ia memset umple primii n octe+i ai 3onei de memorie
indicat de s cu constanta c pe un octet.
Caloare returnat
Func+ia returnea3 un pointer la 3ona de memorie s.
&ume
memchr 2 caut n memorie un caracter
$eclara+ie
-oid +memchr(const -oid +s, int c,
unsi7ned n);
$escriere
Func+ia memchr caut caracterul c n primii n octe+i de memorie
indica+i de s. Cutarea se opre#te la primul octet care are 1aloarea c
9interpretat ca unsi7ned char<.
Caloare returnat
Func+ia returnea3 un pointer la octetul gsit sau A?>> dac
1aloarea nu e-ist n 3ona de memorie.
12.). *peraii cu iruri de caractere
0entru majoritatea func+iilor din aceast categorie compilatorul
e-pandea3 codul acestora folosind instruc+iuni pe #iruri de caractere.
$eclara+iile acestor func+ii se ob+in cu
#include <strin7.h>
&ume
strlen 2 calculea3 lungimea unui #ir
$eclara+ie
unsi7ned strlen(const char +s);
$escriere
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7EE
Func+ia strlen calculea3 lungimea #irului s* fr a include
caracterul terminator null.
Caloare returnat
Func+ia returnea3 numrul de caractere din s.
&ume
strcpy* strncpy 2 copia3 un #ir de caractere
$eclara+ie
char +strcp9(char +dest, const char +src);
char +strncp9(char +dest, const char +src,
unsi7ned n);
$escriere
Func+ia strcp9 copia3 #irul indicat de src 9inclusi1
caracterul terminator null< n 3ona indicat de dest. birurile nu
trebuie s se suprapun* #i n plus 3ona dest trebuie s fie suficient
de mare pentru a primi copia.
Func+ia strncp9 este similar* cu e-cep+ia faptului c nu se
copia3 mai mult de n octe+i din src. 6stfel* dac caracterul
terminator null nu se afl n primii n octe+i din src* re3ultatul nu 1a
fi terminat cu null. @n ca3ul n care lungimea lui src este mai mic
dect n* restul octe+ilor din dest primesc 1aloarea null.
Caloare returnat
Func+iile returnea3 un pointer la #irul dest.
&ume
strdup 2 duplic un #ir
$eclara+ie
char +strdup(const char +s);
$escriere
Func+ia strdup returnea3 un pointer la un nou #ir care este un
duplicat al #irului s. %emoria pentru noul #ir se ob+ine cu malloc*
#i poate fi eliberat cu free.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7E7
Caloare returnat
Func+ia returnea3 un pointer la #irul duplicat* sau A?>> dac nu
e-ist memorie suficient disponibil.
&ume
strcat* strncat 2 concatenea3 dou #iruri
$eclara+ie
char +strcat(char +dest, const char +src);
char +strncat(char +dest, const char +src,
unsi7ned n);
$escriere
Func+ia strcat adaug #irul src la #irul dest suprascriind
caracterul null de la sfr#itul lui dest* #i la sfr#it adaug un caracter
terminator null. birurile nu trebuie s se suprapun* #i n plus #irul
dest trebuie s aib suficient spa+iu pentru a pstra re3ultatul.
Func+ia strncat este similar* cu e-cep+ia faptului c numai
primele n caractere din src se adaug la dest.
Caloare returnat
Func+iile returnea3 un pointer la #irul re3ultat dest.
&ume
strcmp 2 compar dou #iruri de caractere
$eclara+ie
int strcmp(const char +s', const char
+s.);
$escriere
Func+ia strcmp compar cele dou #iruri s' #i s..
Caloare returnat
Func+ia returnea3 un ntreg mai mic dect* egal cu* sau mai mare
dect 3ero dac s' este mai mic dect* coincide* respecti1 este mai
mare dect s..
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7EG
&ume
strchr* strrchr 2 locali3ea3 un caracter
$eclara+ie
char +strchr(const char +s, int c);
char +strrchr(const char +s, int c);
$escriere
Func+ia strchr returnea3 un pointer la prima apari+ie a
caracterului c n #irul s.
Func+ia strrchr returnea3 un pointer la ultima apari+ie a
caracterului c n #irul s.
Caloare returnat
Func+iile returnea3 un pointer la caracterul gsit sau A?>> dac
1aloarea nu a fost gsit.
&ume
strstr 2 locali3ea3 un sub#ir
$eclara+ie
char +strstr(const char +sir, const char
+su(s);
$escriere
Func+ia strstr gse#te prima apari+ie a sub#irului su(s n
#irul sir. Caracterul terminator null nu este luat n considerare.
Caloare returnat
Func+ia returnea3 un pointer la nceputul sub#irului* sau A?>>
dac sub#irul nu este gsit.
&ume
strspn* strcspn 2 caut un set de caractere ntr2un #ir
$eclara+ie
unsi7ned strspn(const char +s, const char
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7EH
+acc);
unsi7ned strcspn(const char +s, const char
+reG);
$escriere
Func+ia strspn calculea3 lungimea segmentului ini+ial din s
format n ntregime numai cu caractere din acc.
Func+ia strcspn calculea3 lungimea segmentului ini+ial din s
format n ntregime numai cu caractere care nu se gsesc n reG.
Calori returnate
Func+ia strspn returnea3 po3i+ia primului caracter din s care
nu se afl n acc.
Func+ia strcspn returnea3 po3i+ia primului caracter din s care
se afl n reG.
12.+. Aiblioteca matematic
7< Func+iile din prima categorie snt descrise n <stdli(.h>.
&ume
rand* srand 2 generarea numerelor pseudo2aleatoare
$eclara+ie
int rand(-oid);
-oid srand(unsi7ned int seed);
$escriere
Func+ia rand returnea3 un ntreg pseudo2aleator ntre 0 #i
V<AEUB<; 9pentru majoritatea mediilor de programare C aceast
constant este egal cu 1aloarea ma-im cu semn repre3entabil pe
un cu1nt al sistemului de calcul<.
Func+ia srand ini+iali3ea3 generatorul cu 1aloarea seed
pentru o nou sec1en+ de 1alori ntregi pseudo2aleatoare care 1or fi
returnate de rand. 6ceste sec1en+e se repet dac srand se apelea3
cu aceea#i 1aloare seed.
:e obi#nuie#te ca generatorul s fie ini+iali3at cu o 1aloare dat
de ceasul sistemului de calcul* ca n e-emplul de mai jos4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
770
#include <time.h>
srand(time(A?>>));
Caloare returnat
Func+ia rand returnea3 o 1aloare ntre 0 #i V<AEUB<;.
Dbser1a+ie
@n lucrarea )umerical .ecipes in */ The Art of &cientific
*omputin 2 illiam M 0ress* Brian 0 Flanner)* :aul 6 /euIolsI)*
illiam / Cetterling = &e' PorI4 Cambridge ,ni1ersit) 0ress* 7HH0
97st ed* p 807<* se face urmtorul comentariu4
S$ac dori+i s genera+i o 1aloare aleatoare ntreag ntre 7 #i 70*
se recomand s folosi+i sec1en+a
G"'%(int)('0.0+rand()F(V<AEUB<;%'.0));
#i nu o sec1en+ de tipul
G"'%(int)('000000.0+rand())#'0;
care folose#te bi+ii de rang inferior.S
/ot n fi#ierul <stdli(.h> snt descrise #i urmtoarele func+ii4
int a(s(int i); 1aloare absolut
lon7 la(s(lon7 i); 1aloare absolut
int atoi(char +s); con1ersie din 6:C;; n ntreg
lon7 atol(char +s); con1ersie din 6:C;; n ntreg lung
dou(le atof(char +s); con1ersie din 6:C;; n dubl
preci3ie
8< Func+iile din a doua categorie snt descrise n fi#ierul
<math.h>.
dou(le fa(s(dou(le 8); 1aloare absolut
dou(le floor(dou(le 8); parte ntreag inferioar
dou(le ceil(dou(le 8); parte ntreag superioar
dou(le sIrt(dou(le 8);
x
dou(le sin(dou(le 8); sin9x<
dou(le cos(dou(le 8); cos9x<
dou(le tan(dou(le 8); tg9x<
dou(le asin(dou(le 8); arcsin9x<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
777
dou(le acos(dou(le 8); arccos9x<
dou(le atan(dou(le 8); arctg9x< n Y2F8*F8[
dou(le atan.(dou(le 9, dou(le 8);
arctg9y/x< n Y5*[
dou(le e8p(dou(le 8); e
x
dou(le lo7(dou(le 8); ln9x<
dou(le pow(dou(le 8, dou(le 9); x
y
dou(le sinh(dou(le 8); sin"9x<
dou(le cosh(dou(le 8); cos"9x<
dou(le tanh(dou(le 8); tg"9x<
dou(le lde8p(dou(le 8, int e); x 8
e
dou(le fmod(dou(le 8, dou(le 9); x modulo y
Func+ia fmod returnea3 o 1aloare f definit astfel4 x = a y + f
a este o 1aloare ntreag 9dat de xFy< #i 0 _f _ g y; f are semnul lui
x.
,rmtoarele dou func+ii returnea3 dou 1alori4 una este
1aloarea returnat de func+ie 9de tip dou(le<* #i cealalt returnat
prin intermediul unui argument de tip pointer la int respecti1
dou(le.
dou(le fre8p(dou(le 8, int +e);
Func+ia fre8p desparte 1aloarea x n dou pr+i4 o parte frac+ionar
normali3at 9f Y0.B*7<< #i un e-ponent e. $ac x este 0 atunci f=0 #i
e=0. Caloarea returnat este f.
dou(le modf(dou(le 8, dou(le +n);
Func+ia modf desparte 1aloarea x n dou pr+i4 o parte frac+ionar
subunitar f #i o parte ntreag n. Calorile f #i n au acela#i semn ca #i
x. Caloarea returnat este f.
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
778
12.4. Programe demonstrati$e
7< 0rogramul pre3entat n continuare generea3 un #ir de n 1alori
ntregi aleatoare n inter1alul Y0*B7[ pe care le depune n tabloul ;
9alocat dinamic<* #i apoi le sortea3 cresctor. @n continuare se
generea3 , 1alori ntregi aleatoare pe care le caut n tabloul ;.
0entru fiecare cutare cu succes se afi#ea3 pe terminal 1aloarea
cutat #i po3i+ia n tablou.
Calorile n* , #i B se iau n aceast ordine din linia de comand.
#include <stdli(.h>
#include <stdio.h>
#include <time.h>
int cmp(const -oid +<, const -oid +C) {
return +(int +)<6+(int +)C;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
777
Aibliogra#ie
Brian !ernig"am* $ennis % Ritc"ie 2 The * 0rorammin !anuae
0rentice2Mall :oft'are :eries* 7H7G
2 !imba,ul *; manual de proramare
;nstitutul de te"nic de calcul* Cluj2&apoca 7HGA
Merbert :c"ildt 2 1anual * complet
Kditura /eora* 7HHG
%anuale electronice
"ttp4=='''.programmingtutorials.com=c."tml
%ars"all Brain 2 %ntroduction to * 0rorammin
"ttp4==de1central.iftec".com=learning=tutorials=c2cpp=c=
:te1e :ummit 2 %ntroductory * 0rorammin *lass )otes
"ttp4=='''.esIimo.com=]scs=cclass=cclass."tml
:te1e :ummit 2 %ntermediate * 0rorammin *lass )otes
"ttp4=='''.esIimo.com=]scs=cclass=cclass."tml
Brian Bro'n 2 * 0rorammin
"ttp4=='''.cit.ac.n3=smac=cprogram=onlinet."tm
Brian Bro'n 2 An %ntroduction to * 0rorammin
"ttp4=='''.cit.ac.n3=smac=cprogram=default."tm
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
77G
Cuprins
7. Leneralit+i asupra limbajului C . . . . . . . . . . . . . . . . . . . A
7.7. ;ntroducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A
7.8. 0rimele programe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B
7.?. %eta2limbajul #i setul de caractere . . . . . . . . . . . . . . . . . . . . H
8. ,nit+ile le-icale ale limbajului C . . . . . . . . . . . . . . . . 70
8.7. ;dentificatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
8.8. Cu1inte c"eie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
8.?. Constante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
8.A. biruri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7A
8.B. Dperatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7B
8.E. :eparatori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7B
?. Cariabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
?.7. Clase de memorie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
?.8. /ipuri de 1ariabile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
?.?. Dbiecte #i 1alori2stnga . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8?
?.A. Con1ersii de tip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8?
A. Dperatori #i e-presii . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
A.7. K-presii primare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
A.8. Dperatori unari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8H
A.?. Dperatori multiplicati1i . . . . . . . . . . . . . . . . . . . . . . . . . . . ?8
A.A. Dperatori aditi1i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ??
A.B. Dperatori de deplasare . . . . . . . . . . . . . . . . . . . . . . . . . . . . ??
A.E. Dperatori rela+ionali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ?A
A.7. Dperatori de egalitate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ?B
A.G. Dperatorul b; pe bi+i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ?B
A.H. Dperatorul :6,2e-clusi1 pe bi+i . . . . . . . . . . . . . . . . . . . . ?B
A.70. Dperatorul :6,2inclusi1 pe bi+i . . . . . . . . . . . . . . . . . . . . ?E
A.77. Dperatorul b;2logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ?E
A.78. Dperatorul :6,2logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . ?7
A.7?. Dperatorul condi+ional . . . . . . . . . . . . . . . . . . . . . . . . . . . ?7
A.7A. Dperatori de atribuire . . . . . . . . . . . . . . . . . . . . . . . . . . . . ?G
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
77H
A.7B. Dperatorul 1irgul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ?H
A.7E. 0receden+a #i ordinea de e1aluare . . . . . . . . . . . . . . . . . . . A0
B. $eclara+ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A8
B.7. :pecificatori de clas de memorie . . . . . . . . . . . . . . . . . . . A?
B.8. :pecificatori de tip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AA
B.?. $eclaratori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AB
B.A. %odificatorul const . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A7
B.B. ;ni+iali3are . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AG
B.E. )ume-tip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AH
E. ;nstruc+iuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B7
E.7. ;nstruc+iunea expresie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B7
E.8. ;nstruc+iunea compus sau blocul . . . . . . . . . . . . . . . . . . . . B7
E.?. ;nstruc+iunea condi+ional . . . . . . . . . . . . . . . . . . . . . . . . . . B8
E.A. ;nstruc+iunea while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BA
E.B. ;nstruc+iunea do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BA
E.E. ;nstruc+iunea for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BB
E.7. ;nstruc+iunea switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . BE
E.G. ;nstruc+iunea (rea, . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BG
E.H. ;nstruc+iunea continue . . . . . . . . . . . . . . . . . . . . . . . . . . BG
E.70. ;nstruc+iunea return . . . . . . . . . . . . . . . . . . . . . . . . . . . BH
E.77. ;nstruc+iunea 1id . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BH
7. Func+iile #i structura unui program . . . . . . . . . . . . . . . . E0
7.7. $efini+ia func+iilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E0
7.8. 6pelul func+iilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E?
7.?. Re1enirea din func+ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .E?
7.A. 6rgumentele func+iei #i transmiterea parametrilor . . . . . . . EA
7.B. Func+ii cu numr 1ariabil de parametri . . . . . . . . . . . . . . . . EB
7.E. K-emple de func+ii #i programe . . . . . . . . . . . . . . . . . . . . . EE
G. Liniile de control ale compilatorului . . . . . . . . . . . . . . . 70
G.l. @nlocuirea simbolurilor* substitu+ii macro . . . . . . . . . . . . . . 70
G.8. ;ncluderea fi#ierelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
G.?. Compilarea condi+ionat . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
G.A. ,tili3area directi1elor de compilare . . . . . . . . . . . . . . . . . . 7?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7G0
H. 0ointeri #i masi1e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7E
H.7. 0ointeri #i adrese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7E
H.8 0ointeri #i argumente de func+ii . . . . . . . . . . . . . . . . . . . . . . 77
H.?. 0ointeri #i masi1e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7G
H.A. 6ritmetica de adrese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . G0
H.B. 0ointeri la caracter #i func+ii . . . . . . . . . . . . . . . . . . . . . . . . G?
H.E. %asi1e multidimensionale . . . . . . . . . . . . . . . . . . . . . . . . . GE
H.7. %asi1e de pointeri #i pointeri la pointeri . . . . . . . . . . . . . . GG
H.G. ;ni+iali3area masi1elor #i masi1elor de pointeri . . . . . . . . . H?
H.H. %asi1e de pointeri #i masi1e multidimensionale . . . . . . . . HE
H.70. 6rgumentele unei linii de comand . . . . . . . . . . . . . . . . . H7
H.77. 0ointeri la func+ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
70. :tructuri #i reuniuni . . . . . . . . . . . . . . . . . . . . . . . . . 70E
70.7. Klemente de ba3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70E
70.8. :tructuri #i func+ii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70G
70.?. %asi1e de structuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770
70.A. 0ointeri la structuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77B
70.B. :tructuri auto2referite . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
70.E. Cutare n tabele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78?
70.7. Cmpuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 787
70.G. Reuniuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78H
70.H. $eclara+ii de structuri* reuniuni #i cmpuri . . . . . . . . . . 7?7
70.70. R9pedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7??
77. ;ntrri = ie#iri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7?E
77.7. ;ntrri #i ie#iri standard; fi#iere . . . . . . . . . . . . . . . . . . . . 7?E
77.8. 6ccesul la fi#iere; desc"idere #i nc"idere . . . . . . . . . . . 7?G
77.?. Citire #i scriere fr format . . . . . . . . . . . . . . . . . . . . . . . 7A7
77.A. Citire cu format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7A?
77.B. :criere cu format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7A7
77.E. /ratarea erorilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7B8
77.7. Dpera+ii cu directoare . . . . . . . . . . . . . . . . . . . . . . . . . . . 7BA
77.G. 0rograme demonstrati1e . . . . . . . . . . . . . . . . . . . . . . . . 7BE
78. 6lte rutine din biblioteca standard . . . . . . . . . . . . . . 7E0
78.7. 6locarea dinamic a memoriei . . . . . . . . . . . . . . . . . . . . 7E0
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7G7
78.8. :ortare #i cutare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7E7
78.?. Rutine de clasificare . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7E8
78.A. Dpera+ii cu blocuri de memorie . . . . . . . . . . . . . . . . . . . 7EA
78.B. Dpera+ii cu #iruri de caractere . . . . . . . . . . . . . . . . . . . . 7EE
78.E. Biblioteca matematic . . . . . . . . . . . . . . . . . . . . . . . . . . 770
78.7. 0rograme demonstrati1e . . . . . . . . . . . . . . . . . . . . . . . . . 77?
Bibliografie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77G
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7G8