Sie sind auf Seite 1von 28

Modul 2 - Introducere n limbajul C.

Elemente de baz ale


limbajului

Limbaje de programare
Limbajul C istoric i caracteristici
Dezvoltarea de programe C
Structura programelor C
Elemente de baz ale limbajului C
Tipuri de date i constante
Variabile i operatori
Expresii

nainte de prezentarea sintaxei i a elementelor de baz ale limbajului C, vom descrie, pe scurt,
istoricul i caracteristicile limbajului C. Limbajul C este un limbaj de baz pentru programatorii
profesioniti. Are caracteristicile limbajelor de nivel nalt, fiind ns mult mai flexibil, aspect care
poate fi exploatat de programatorii experimentai.

Limbaje de programare
Noiunea de limbaj de programare este definit ca fiind ansamblul format de un vocabular i un
set de reguli gramaticale, necesar instruirii unui computer pentru a realiza anumite activiti.
Altfel spus, limbajul de programare este o notaie sistematic prin care se descrie un proces de
calcul. El d posibilitatea programatorului s specifice n mod exact i amnunit aciunile pe
care trebuie s le execute calculatorul, n ce ordine i cu ce date. Specificarea const practic n
ntocmirea/scrierea programelor necesare ("programare").
Orice limbaj (natural sau artificial) presupune definirea unui set de reguli sintactice i
semantice.
Sintaxa reprezint un set de reguli ce guverneaz alctuirea propoziiilor dintr-un limbaj. n
cazul limbajelor de programare echivalentul propoziiei este programul. Semantica este un set
de reguli ce determin nelesul sau semnificaia propoziiilor ntr-un limbaj.
Putem defini dou mari categorii de limbaje de programare:
1.

Limbaje de nivel cobort, dependente de calculator. Aici avem:


Limbajul main
Limbajul de asamblare

Limbajul main este limbajul pe care computerul l nelege n mod direct; n acest limbaj
programele se scriu n cod binar ca succesiuni de 0 i 1, fiecare instruciune din limbajul main
fiind o combinaie de 4 bii (exemple: LOAD-0000, ADD-0001). Pentru aceasta programatorul

trebuie s cunoasc detaliat structura hardware a computerului, trebuie s gestioneze fr


greeal alocarea adreselor de memorie pentru un program. Pot aprea multe erori datorate
concepiei programului, sintaxei, suprapunerii adreselor de memorie, etc.
n plus fa de limbajul main, la nivelul limbajului de asamblare, apar mnemonice pentru
operaiuni i simboluri pentru adrese.
Limbajul de asamblare presupune existena unui program numit assembler (asamblor) care s
traduc programele n limbaj main. Asamblorul nlocuiete codarea mnemonic (cum ar fi
ADD) cu coduri binare corespunztoare limbajului main i aloc adrese de memorie pentru
toate variabilele simbolice utilizate (A, B, C) i se asigur c aceste adrese sunt distincte. Astfel
prin uurarea procesului de programare s-a introdus un nou nivel de procesare pentru
computer. Astzi limbajele de asamblare sunt nc utilizate pentru unele programe critice
deoarece aceste limbaje confer programatorului un control foarte precis a ceea ce se ntmpl
n computer.
Limbaje de nivel nalt, independente de structura calculatorului. Cteva exemple n
ordinea apariiei lor:
Fortran (FORmula TRANslation) 1955, IBM, pentru probleme tehnico-tiinifice
Cobol 1959, pentru probleme economice
Programarea structurat apare prin anii 70 (Pascal, C, etc)
Programare orientat pe obiecte prin anii 80 (C++, Java, etc)

Bazele programrii structurate au fost puse de Dijkstra i Hoare. Este o modalitate de


programare n care abordarea este top-down: descompunerea problemei complexe n
subprobleme mai simple, numite module. Tot aici apare i teorema de structur a lui Bohm i
Jacopini, pe care am folosit-o deja n elaborarea algoritmilor. Aceast teorem spune c orice
algoritm poate fi compus din numai trei structuri de calcul:
1. structura secvenial - secvena;
2. structura alternativ - decizia;
3. structura repetitiv - ciclul.
Ideea programrii orientate pe obiecte este aceea de a crea programele sub forma unei colecii
de obiecte, uniti individuale de cod, care interacioneaz unele cu altele, n loc de simple liste
de instruciuni sau de apeluri de proceduri aa cum apare n programarea structurat.
Obiectele POO sunt de obicei reprezentri ale obiectelor din viaa real, astfel nct programele
realizate prin tehnica POO sunt mai uor de neles, de depanat i de extins dect programele
procedurale. Aceasta este adevrat mai ales n cazul proiectelor software complexe i de
dimensiuni mari, care se gestioneaz fcnd apel la ingineria programrii.
Dupa modul de traducere limbajele de programare pot fi:
Limbaje compilate: C, C++, Pascal, Java;
Limbaje interpretate: PHP, Javascript, Prolog, Matlab

La limbajele compilate translatorul se numete compilator, iar mecanismul folosirii unui astfel
de limbaj este urmtorul: programul surs este tradus integral n limbajul main, iar rezultatul
este un fiier executabil, viteza de execuie a acestuia fiind ridicat, ntruct programul este
deja transpus n ntregime n cod main.
La limbajele interpretate translatorul poart denumirea de interpretor i funcioneaz n felul
urmtor: preia prima comand din codul surs, o traduce n limbajul main i o execut, apoi a
doua comand i tot aa.
Multe limbaje moderne combin compilarea cu interpretarea: codul surs este compilat ntr-un
limbaj binar numit bytecode, care la rulare este interpretat de ctre o main virtual. De
remarcat faptul c unele interpretoare de limbaje pot folosi compilatoare aa-numite just-intime, care transform codul n limbaj main chiar naintea executrii.

Limbajul C - Scurt istoric


Limbajul C a fost proiectat i implementat de Dennis Ritchie ntre anii 1969 i 1973 la AT&T Bells
Laboratories, pentru programe de sistem (care pn atunci erau dezvoltate doar n limbaje de
asamblare). A fost numit C deoarece este un succesor al limbajului B, limbaj creat de Ken
Thompson.
Originile limbajului C sunt strns legate de cele ale UNIX-ului, care iniial fusese implementat n
limbajul de asamblare PDP-7 tot de Ritchie i Thompson. Deoarece limbajul B nu putea folosi
eficient unele din facilitile PDP-11, pe care vroiau s porteze UNIX-ul, au avut nevoie de un
limbaj simplu i portabil pentru scrierea nucleului sistemului de operare UNIX.
n 1973, sistemul de operare UNIX este aproape n totalitate rescris n C, fiind astfel unul
din primele sisteme de operare implementate n alt limbaj dect cel de asamblare.
Cartea de referin care definete un standard minim este scris de Brian W. Kernighan
i Dennis Ritchie, "The C Programming Language" i a aprut n 1978 (Prentice Hall).
ntre 1983-1989 a fost dezvoltat un standard international -- ANSI C (ANSI - American
National Standards Institute).
n 1990, ANSI C standard a fost adoptat de International Organization for
Standardization (ISO) ca ISO/IEC 9899:1990, care mai este numit i C90. Acest standard
este suportat de compilatoarele curente de C. Majoritatea codului C scris astzi are la
baz acest standard. Orice program scris doar n ANSI C Standard va rula corect pe orice
platform ce are instalat o variant de C.
n anii urmtori au fost dezvoltate medii de programare C performante sub UNIX i DOS,
care au contribuit la utilizarea masiv a limbajului.
Necesitatea gruprii structurilor de date cu operaiile care prelucreaz respectivele date
a dus la apariia noiunilor de obiect sau clas, n 1980, Bjarne Stroustrup elaboreaz C
with Classes.
Acest limbaj a dus la mbuntirea C-ului prin adugarea unor noi faciliti, printre care
i lucrul cu clase. n vara 1983, C-with-classes a ptruns i n lumea academic i a
instituiilor de cercetare. Astfel, acest limbaj a putut s evolueze datorit experienei
acumulate de ctre utilizatorii si. Denumirea final a acestui limbaj a fost C++.
Succesul extraordinar pe care l-a avut limbajul C++ a fost asigurat de faptul c a extins
cel mai popular limbaj al momentului, C.

Programele scrise n C funcioneaz i n C++, i ele pot fi transformate n C++ cu eforturi


minime.
Cea mai recent etap n evoluia acestui limbaj o constituie limbajul JAVA (1995)
realizat de firma SUN, firm cumprat n 2010 de ctre Oracle.
n concluzie, sintaxa limbajului C a stat la baza multor limbaje create ulterior i nc populare
azi: C++, Java, JavaScript, C#.

Caracteristicile limbajului C
Caracteristicile limbajului C, care i-au determinat popularitatea, sunt prezentate pe
scurt mai jos i vor fi analizate pe parcursul cursului:
limbaj de nivel mediu, portabil, structurat, flexibil
produce programe eficiente ( lungimea codului sczut, vitez de execuie mare )
set bogat de operatori
multiple faciliti de reprezentare i prelucrare a datelor
utilizare extensiv a apelurilor de funcii i a pointerilor
verificare mai sczut a tipurilor - loose typing - spre deosebire de PASCAL
permite programarea la nivel sczut - low-level - , apropiat de hardware
Este utilizat n multiple aplicaii, n care nu predomin caracterul numeric:
programe de sistem
proiectare asistat de calculator
grafic
prelucrare de imagini
aplicaii de inteligen artificial.

Procesul dezvoltrii unui program C


Un program este descrierea precis i concis a unui algoritm ntr-un anumit limbaj de
programare. Putem spune c un program este o secven de instruciuni care se execut una
dup cealalt secvenial:
Secvenial
Instruciune 1

Instruciune 2
.
.
.

Instruciune n

Un program are un caracter general i de aceea are nevoie de date iniiale care particularizeaz
programul pentru o situaie concret. Rezultatele produse de un program pe baza datelor
iniiale sunt de obicei afiate pe ecran. Datele de intrare se introduc manual de la tastatur sau
se citesc din fiiere disc.
Operaiile uzuale din limbajele de programare sunt operaii de prelucrare (calcule, comparaii
etc) i operaii de intrare-ieire (de citire-scriere). Aceste operaii sunt exprimate prin
instruciuni ale limbajului sau prin apelarea unor funcii standard predefinite (de bibliotec).
Desfurarea n timp a instruciunilor de prelucrare i de intrare-ieire este controlat prin
instruciuni repetitive (de ciclare) i de decizie (de comparaie).
Fiecare limbaj de programare are reguli gramaticale precise, a cror respectare este verificat
de programul compilator (translator).
Pentru a dezvolta un program C putem folosi un mediu integrat de dezvoltare (IDE - Interactive
Development Environment) precum CodeBlocks, DevCpp, MS Visual Studio, Eclipse sau
Netbeans, sau o putem face n mod linie de comand.
Etapele necesare pentru dezvoltarea unui program C sunt urmtoarele:
Etapa 1: Codificarea algoritmului ntr-un limbaj de programare - Edit
Aceast codificare se va realiza ntr-un program surs.
Se salveaz fiierul surs, de exemplu cu numele "Hello.c". Un fiier C++ trebuie salvat cu
extensia ".cpp", iar un fiier C cu extensia .c. Trebuie ales un nume care s reflecte scopul
programului.
Aceast etap se poate realiza utiliznd comenzile respective ale IDE-ului de exemplu New,
Save - sau un editor de texte Notepad.
Etapa 2: Compilarea i link-editarea - Build
n acest pas, prin compilare i link-editare, programul surs este tradus integral n limbajul
main, iar rezultatul este un fiier executabil.
Aceast etap se poate realiza utiliznd comenzile respective ale IDE-ului de exemplu
Compile, Build - sau linie de comand, cu compilatorul GNU GCC:
n Windows (CMD shell) - genereaz fiierul
executabil Hello.exe
n Unix or Mac (Bash shell) - genereaz fiierul
executabil Hello

> gcc Hello.c -o Hello.exe


$ gcc Hello.c -o Hello

Etapa 3: Execuia programului - Run


Aceast etap se poate realiza utiliznd comenzile respective ale IDE-ului Run - sau linie de
comand. De exemplu, lansarea n execuie n mod linie de comand se poate face astfel:
n Windows (CMD shell) - Rulare "Hello.exe" (.exe este opional)
n Unix or Mac (Bash shell) - Rulare "Hello"

> Hello
$ ./Hello

Detaliarea acestor etape este reflectat n figura urmtoare: n stnga avem tipul de fiiere, la
mijloc cine realizeaz acel pas, pentru ca n partea dreapt a figurii s apar paii efectivi:

Editor sau IDE

Pas 1: Scriere cod surs

Cod surs (.c, .cpp), Header (.h)


Preprocesor

Pas 2: Preprocesare

Includerea altor fiiere, nlocuire text


Compilator

Pas 3: Compilare

BUILD

Cod obiect (.o, .obj)


Biblioteci statice (.lib, .l)

Linker

Pas 4: Link-editare
LinkPreprocesare

Loader

Pas 5: ncrcare
ncancrcaren
crcarePreproces
are
Pas 6: Execuie

Cod executabil
Biblioteci dinamice (.dll, .so)

DATE INTRARE

CPU

RUN

DATE IEIRE

Tabelul conine o descriere sintetic a pailor detaliai:

Pas

Descriere

Crearea fiierului surs (cu extensia .c sau .cpp n cazul limbajului C/C++) folosind
un editor de texte sau un IDE. Rezult un fiier surs. Poate fi creat i un fiier
antet (header), cu extensia .h

Preprocesarea codului surs n concordan cu directivele de preprocesare


(#include, #define n C). Aceste directive indic operaii (includerea unui alt
fiier, nlocuire de text etc) care se vor realiza NAINTE de compilare.

Compilarea codului surs preprocesat. Rezult un fiier obiect (.obj, .o).

Legarea (linked-itarea) codului obiect rezultat cu alte fiiere obiect i biblioteci


pentru a furniza fiierul executabil (.exe).

ncrcarea codului executabil n memoria calculatorului (RAM).

Rularea codului executabil.

Pentru mai multe detalii vom include aici tutoriale de utilizare a unor medii integrate de
dezvoltare C:
Tutorial CodeBlocks
Tutorial NetBeans

Structura unui program C


Un program C este compus dintr-o ierarhie de funcii, orice program trebuind s conin cel
puin funcia main, prima care se execut la lansarea programului C. Funciile pot face parte
dintr-un singur fiier surs sau din mai multe fiiere surs. Un fiier surs C este un fiier text
care conine o succesiune de funcii i, eventual, declaraii de variabile.

Structura unui program C este, n principiu, urmtoarea:


directive preprocesor
definiii de tipuri
prototipuri de funcii - tipul funciei i tipurile parametrilor funciei
definiii de variabile externe
definiii de funcii

O funcie C are un antet i un bloc de instruciuni (prin care se execut anumite aciuni) ncadrat
de acolade. n interiorul unei funcii exist de obicei declaraii de variabile precum i alte
blocuri de instruciuni.
Primul program C
Urmeaz un exemplu de program C minimal, ce afieaz un text Hello World! pe ecran.
Exemplul conine o funcie main cu o singur instruciune (apelul funciei printf) i nu conine
declaraii i este scris n trei variante diferite pentru funcia main:

Varianta

Cod

#include<stdio.h>
void main(void)
{
printf(Hello World!);
}

2 fr void n antetul
main-ului

#include<stdio.h>
void main()
{
printf(Hello World!);
}

3 - fr warning la
compilare n
Code::Blocks

#include<stdio.h>
int main()
{
printf(Hello World!);
return 0;
}

Execuia programului ncepe cu prima linie din main. Cuvntul din faa funciei main reprezint
tipul funciei (void arat c aceast funcie nu transmite nici un rezultat prin numele su, int
arat c trimite un rezultat de tip ntreg, prin instruciunea return). Parantezele care urmeaz
cuvntului main arat c main este numele unei funcii (i nu este numele unei variabile), dar o
funcie fr parametri (acel void care poate lipsi varianta 2).
Acoladele sunt necesare pentru a delimita corpul unei funcii, corp care este un bloc de
instruciuni i declaraii. Funcia printf realizeaz afiarea pe ecran a textului Hello World!.
Directiva #include este o directiv de preprocesare, permite includerea unor funcii de
bibliotec, necesar pentru folosirea funciei printf.
Alte observaii care pot fi fcute:
cuvintele cheie sunt scrise cu litere mici
instruciunile se termin cu ';'
irurile de caractere sunt incluse ntre ghilimele
limbajul C este case sensitive face diferen ntre literele mici i literele mari ( a
este diferit de A )
\n folosit n funcia printf poziioneaz cursorul la nceputul liniei urmtoare

Elemente de baz ale limbajului C


Elementele de baz ale limbajului C sunt urmtoarele:
Alfabetul i atomii lexicali
Identificatorii
Cuvintele cheie
Tipurile de date
Constantele i variabilele
Comentariile
Operatorii i expresiile
Alfabetul limbajului
Caracterele se codific conform codului ASCII (American Standard Code for Information
Interchange), codificarea realizndu-se pe 8 bii (un octet). Sunt 256 (codificate de la 0 la 255)
de caractere n codul ASCII, alfabetul cuprinznd simboluri grafice i simboluri fr
corespondent grafic.
De exemplu, caracterul A cu codul ASCII 65 este codificat pe 8 bii 1 octet astfel:

Puterea lui 2
Valoare
biti

76543210
01000001

Pentru a nelege mai bine ce nseamn mod de codificare urmtoarele noiuni auxiliare sunt
descrise n anexa Tutorial despre reprezentarea datelor.
Octet
reprezentare n baza 2, 8, 10, 16
Limbajul C este case-sensitive (se face diferen ntre litere mici i litere mari).
O alt observaie este aceea c spaiul are codul mai mic decat simbolurile grafice (32), iar
cifrele (n ordine cresctoare), literele mari i literele mici (n ordine alfabetic) ocup cte trei
zone compacte - cu intervale ntre ele.
Pentru mai multe detalii legate de codul ASCII v rugm s urmai unul din urmtoarele link-uri:
Tabel Coduri ASCII
Tabel Coduri ASCII 2

Atomii lexicali pot fi:


identificatori
constante (explicite) - numerice, caracter, ir
operatori
semne de punctuaie.

Un atom lexical trebuie scris integral pe o linie i nu se poate extinde pe mai multe linii. n
cadrul unui atom lexical nu se pot folosi spaii albe (excepie fac spaiile dintr-o constant ir),
putem ns folosi caracterul '_'.
Respectarea acestei reguli poate fi mai dificil n cazul unor iruri constante lungi, dar exist
posibilitatea prelungirii unui ir constant de pe o linie pe alta folosind caracterul '\'.
Atomii lexicali sunt separai prin separatori, care pot fi:
spaiul
caracterul de tabulare orizontal \t
terminatorul de linie \n
comentariul
Un program este adresat unui calculator pentru a i se cere efectuarea unor operaii, dar
programul trebuie citit i neles i de ctre oameni; de aceea se folosesc comentarii care
explic de ce se fac anumite aciuni.
Iniial n limbajul C a fost un singur tip de comentariu, comentariul multilinie, care ncepea cu
secvena /* i se termina cu secvena */. Ulterior s-au adoptat i comentariile din C++, care
ncep cu secvena // i se termin la sfritul liniei care conine acest comentariu.

Identificatorii pot fi :
nume utilizator - nume de variabile, constante simbolice, funcii, tipuri,
structuri, uniuni - este bine sa fie alese ct mai sugestiv pentru scopul
utilizrii;
cuvinte cheie ale limbajului C - pot fi folosite doar cu nelesul cu care au
fost definite
cuvinte rezervate - nelesul poate fi modificat, de evitat acest lucru;
Limbajul C impune urmtoarele reguli asupra identificatorilor:
Un identificator este o secven de caractere, de o lungime maxim ce depinde de compilator
(n general are maxim 255 de caractere). Secvena poate conine litere mici i mari(a-z, A-Z), cifre
(0-9) i simbolul '_' (underscore, liniua de subliniere).
Primul caracter trebuie s fie o liter sau '_'. Pentru c multe nume rezervate de
compilator, invizibile programatorului, ncep cu '_', este indicat a nu utiliza '_' pentru

nceputul numelor utilizator.


Un identificator nu poate fi un cuvnt cheie (int, double, if, else, for).
Deoarece limbajul C este case-sensitive identificatorii sunt i ei la rndul lor case-sensitive.
Astfel, suma nu este Suma i nici SUMA.
Identificatorii sunt atomi lexicali, n cadrul lor nu e permis utilizarea spaiilor albe i a altor
caractere speciale (ca +, -, *, /, @, &, virgul, etc.) putem ns folosi caracterul '_'.
Exemple de identificatori: suma, _produs, x2, X5a, PI, functia_gauss etc.

Recomandri:
Este important s alegem un nume care este self-descriptive, care reflect foarte bine
nelesul identificatorului respectiv, de exemplu, vom spune nrStudenti sau
numarDeStudenti.
ncercai s nu folosii identificatori care nu spun nimic (lipsii de un sens clar): a, b, c, d,
i, j, k, i1, j99.
Evitai numele de un singur caracter care sunt mai uor de folosit dar de cele mai multe
ori lipsite de vreun neles. Acest lucru este ns utilizat dac sunt nume commune cum
ar fi x, y, z pentru coordinate sau i, j pentru indici.
Nu folosii nume foarte lungi, sunt greu de utilizat, ncercai s optimizai lungimea
numelui cu nelesul acestuia.
Folosii singularul i pluralul pentru a diferenia. De exemplu, putem folosi numele linie
pentru a ne referi la numrul unei singure linii i numele linii pentru a ne referi la mai
multe linii (de exemplu un vector de linii).
Cuvintele cheie se folosesc n declaraii i instruciuni i nu pot fi folosite ca nume de variabile sau de
funcii (sunt cuvinte rezervate ale limbajului). Exemple de cuvinte cheie:

int
char

extern
register

double
float

unsigned
do
while
switch
case
short
long

typedef
else
struct
union
sizeof
break
auto

static
for
goto
return
default
if
continue

Standardul ANSI C a mai adugat:

signed
enum

const
volatile

void

Numele de funcii standard (scanf, printf, sqrt etc.) nu sunt cuvinte cheie, dar nu se recomand utilizarea
lor n alte scopuri, deoarece aceasta ar produce schimbarea sensului iniial, atribuit n toate versiunile
limbajului.

Tipuri de date
n C exist tipuri de date fundamentale i tipuri de date derivate. Sunt prezentate mai jos principale
tipuri
de date i numrul de octei pe care acestea le ocup pe un sistem Unix de 32 de bii.

Tipurile de date fundamentale sunt:


caracter (char 1 octet)
ntreg (int 4 octei)
virgul mobil (float 4 octei)
virgul mobil dubl precizie (double 8 octei)
nedefinit (void)
Tipurile de date derivate sunt:
tipuri structurate (tablouri, structuri)
tipul pointer (4 octei)
Pentru a utiliza eficient memoria i a satisface necesitile unei multitudini de aplicaii exist n
C mai multe tipuri de ntregi i respectiv de reali, ce difer prin memoria alocat i deci prin
numrul de cifre ce pot fi memorate i prin domeniul de valori.
Tipurile ntregi sunt: char , short , int , long , long long. Implicit toate numerele ntregi sunt
numere cu semn (signed), dar prin folosirea cuvntului cheie unsigned la declararea lor se poate
cere interpretarea ca numere fr semn. Utilizarea cuvintelor long sau short face ca tipul
respectiv s aib un domeniu mai mare, respectiv mai mic de valori.

Tipuri n virgul mobil (reale): Exist dou tipuri, float i double, pentru numere reale
reprezentate n virgul mobil cu simpl i respectiv dubl precizie. Unele implementri suport
i long double (numai cu semn). Trebuie semnalat faptul c nu toate numerele reale pot fi
reprezentate, ntruct memorarea valorilor reale, fiind realizat pe un numr anume de bii, nu
poate reine dect o parte dintre cifrele semnificative. Deci numai anumite valori reale au
reprezentarea exact n calculator, restul confundndu-se cu reprezentarea cea mai apropiat.
Caractere: Caracterele (exemplu 'a', 'Z', '0', '9') sunt codificate ASCII sub form de valori ntregi,
i pstrate n tipul char. De exemplu, caracterul '0' este 48 (decimal, adic n baza 10) sau 30H
(hexadecimal baza 16); caracterul 'A' este 65 (decimal) sau 41H (hexadecimal); caracterul 'a'
este 97 (decimal) sau 61H (hexadecimal). Se observ c tipul char poate fi interpretat ca i
character n codul ASCII sau ca un ntreg fr semn n domeniul 0 255.
Standardul C din 1999 prevede i tipul boolean _Bool (sau bool) pe un octet.
Reprezentarea intern i numrul de octei necesari pentru fiecare tip nu sunt reglementate de
standardul limbajului C, dar limitele fiecrui tip pentru o anumit implementare a limbajului pot
fi aflate din fiierul antet limits.h (care conine i nume simbolice pentru aceste limite INT_MAX i INT_MIN) sau utiliznd operatorul sizeof.
De obicei tipul int ocup 4 octei, iar valoarea maxim este de cca. 10 cifre zecimale pentru tipul
int. Depirile la operaii cu ntregi de orice lungime nu sunt semnalate dei rezultatele sunt
incorecte n caz de depire.
Reprezentarea numerelor reale n diferite versiuni ale limbajului C este mai uniform deoarece
urmeaz un standard IEEE de reprezentare n virgul mobil. Pentru tipul float domeniul de
valori este ntre 10E-38 i 10E+38 iar precizia este de 6 cifre zecimale exacte. Pentru tipul
double domeniul de valori este ntre 10E-308 i 10E+308 iar precizia este de 15 cifre zecimale.
Tabelul urmtor prezint dimensiunea tipic, valorile minim i respective maxim pentru
tipurile primitive (n cazul general). nc o dat, dimensiunea este dependent de
implementarea C folosit.
Categorie

Tip

Descriere

Octei

Valoare
minim

Valoare
Maxim

int
signed int

ntreg cu semn (cel


puin 16 bii)

4 (2)

-2147483648

2147483647
(=231-1)

unsigned int

ntreg fr semn (cel


puin 16 bii)

4 (2)

4294967295
(=232-1 )

char

Caracter
(poate fi cu semn
sau fr semn,
depinde de
implementare)

signed char

Caracter sau ntreg


mic cu semn
(garanteaz c e cu
semn)

-128

127
(=27-1 )

Numere
ntregi

unsigned char

Caracter or sau
ntreg mic fr semn
(garanteaz c e
fr semn)

255
(=28-1 )

short
short int
signed short
signed short int

ntreg scurt cu semn


(cel puin 16 bii)

-32768

32767

unsigned short
unsigned short int

ntreg scurt fr
semn (cel puin 16
bii)

65535
(=216-1 )

long
long int
signed long
signed long int
unsigned long
unsigned long int

ntreg lung cu semn


(cel puin 32 bii)

4 (8)

-2147483648

2147483647

ntreg lung fr
semn (cel puin 32
bii)

4 (8)

4294967295
(=232-1 )

long long
long long int
signed long long
signed long long int

ntreg foarte lung cu


semn (cel puin 64
bii) (de la
standardul C99)

-263

(=263-1)

unsigned long long


unsigned long long int

ntreg foarte lung


fr semn (cel puin
64 bii) (de la
standardul C99)

264-1

float

Numr n virgul
mobil, 7 cifre(IEEE
754 format virgul
mobil simpl
precizie)

3.4e-38

3.4e38

double

Numr n virgul
mobil dubl
precizie, 15
cifre(IEEE 754
format virgul
mobil dubl
precizie)

1.7e-308

1.7e308

long double

Numr lung n
virgul mobil dubl
precizie, 19
cifre(IEEE 754
format virgul
mobil cvadrupl

12 (8)

3.4E-4932

1.1E4932

Numere
Reale

(=215-1 )

(=231-1 )

precizie)
Valoare boolean
care poate fi fie
true fie false
(de la standardul
C99)

bool

Numere
booleene

false (0)

true (1 sau
diferit de
zero)

Valori corespunztoare tipurilor fundamentale


Aceste valori constante, ca 123, -456, 3.14, 'a', "Hello", pot fi atribuite direct unei variabile sau
pot fi folosite ca parte component a unei expresii.
Valorile ntregi se reprezint implicit n baza 10 i sunt de tipul signed care este acoperitor
pentru reprezentarea lor.
Pentru reprezentarea constantelor fr semn se folosete sufixul u sau U
Constant ntreag poate fi precedat de semnul plus (+) sau minus.
Se poate folosi prefixul '0' (zero) pentru a arta c acea valoare este reprezentat n
octal, prefixul '0x' pentru o valoare n hexadecimal i prefixul '0b' pentru o valoare
binar (n unele compilatoare).
Un ntreg long este identificat prin folosirea sufixului 'L' sau 'l'. Un long long int este
identificat prin folosirea sufixului 'LL'. Putem folosi sufixul 'U' sau 'u' pentru unsigned int,
'UL' pentru unsigned long, i 'ULL' pentru unsigned long long int.
Pentru valori constante de tip short nu e nevoie de sufix.
Exemple:
-10000
65000
32780
32780u
1234;
01234;
0x1abc;
0b10001001;
12345678L;
123UL;
987654321LL;

//
//
//
//
//
//
//
//
//
//
//

int
long
long
unsigned int
Decimal
Octal 1234, Decimal 2322
hexadecimal 1ABC, decimal 15274
binar (doar n unele compilatoare)
Sufix 'L' pentru long
int 123 auto-cast la long 123L
sufix 'LL' pentru long long int

Valorile reale
Sunt implicit de tipul double; sufixul f sau F aplicat unei constante, o face de tipul float, iar l sau
L de tipul long double.
Un numr cu parte fracionar, ca 55.66 sau -33.442, este tratat implicit ca double.
O constanta real se poate reprezenta i sub forma tiinific.
Exemplu:

// 1.2*103
// -5.5*10-6

1.2e3
-5.5E-6

unde E denot exponentul puterii lui 10. Mantisa, partea de dinaintea lui E poate fi precedat
de semnul plus (+) sau minus (-).
mantisa - parte_intreag.parte_zecimala ( oricare din cele dou pri poate lipsi, dar nu
ambele )
exponent - eval_exponent sau Eval_exponent, unde val_exponent este un numr ntreg.
Valoarea constantei este produsul dintre mantisa si 10 la puterea data de exponent.
In tabelul de mai jos apar cateva exemple de constante reale:

Constante de tip
float

Constante de tip
double

Constante de tip long


double

1.f

1.

1.L

.241f

.241

.241l

-12.5e5f

-12.5e5

-12.5e5l

98.E-12f

98.E-12

98.E-12L

Valori caracter
Valorile de tip caracter se reprezint pe un octet i au ca valoare codul ASCII al caracterului
respectiv.
n reprezentarea lor se folosete caracterul apostrof : A (cod ASCII 65), b, +.
Pentru caractere speciale se folosete caracterul \.
Exemple:
\ - pentru apostrof
\\ - pentru backslash
Este greit:
sau \

Tot aici intr i secvenele escape ce se pot scrie sub forma unei secvene ce ncepe cu \,
Constantele caracter pot fi tratate n operaiile aritmetice ca un ntreg cu semn pe 8 bii. Cu alte
cuvinte, char i signed int pe 8 bii sunt interschimbabile. De asemenea, putem atribui un ntreg
n domeniul [-128, 127] unei variabile de tip char i [0, 255] unui unsigned char.
Caracterele non-tipribile i caracterele de control pot fi reprezentate printr-o secven
escape, care ncepe cu un back-slash (\) urmat de o liter (\n = new line , \t =tab , \b =
backspace etc), sau de codul numeric al caracterului n octal sau n hexazecimal (\012 = \0x0a =
10 este codul pentru caracterul de trecere la linie nou \n).
Cele mai utilizate secvene escape sunt:

Secvena escape
\n

Descriere
Linie nou (Line feed)

Hexa (Decimal)
0AH (10D)

\r

Carriage-return

0DH (13D)

\t

Tab

09H (9D)

\"

Ghilimele

22H (34D)

\'

Apostrof

27H (39D)

\\

Back-slash

5CH (92D)

Valori ir de caractere
Valorile ir de caractere sunt compuse din zero sau mai multe caractere precizate ntre
ghilimele.
Exemple:
"Hello, world!"
"The sum is "
""

Fiecare caracter din ir poate fi un simbol grafic, o secven escape sau un cod ASCII (n octal
sau hexazecimal). Spaiul ocupat este un numr de octei cu unu mai mare dect numrul
caracterelor din ir, ultimul octet fiind rezervat pentru terminatorul de ir: caracterul cu codul
ASCII 0, adica '\0'. Dac se dorete ca i caracterul ghilimele s faca parte din ir, el trebuie
precedat de \.
Exemple:
"CURS"
"\x43URS"
// scrieri echivalente ale unui ir ce ocup 5 octei
"1a24\t"
- "\x31\x61\x32\x34\11"
//scrieri echivalente ale unui sir ce ocup 6 octei
"'\""
//ir ce conine caracterele '" i terminatorul - ocup 3 octei

Tipul void nu are constante (valori) i este utilizat atunci cnd funciile nu ntorc valori sau cnd
funciile nu au parametri:
void f ( int a)
{
if (a) a = a / 2;
}
sau cnd funciile nu au parametri:
void f (void);

// echivalent cu void f();


int f (void);
//echivalent cu int f();

Constante
Constantele pot fi: predefinite sau definite de utilizator.
Literele mari se folosesc n numele unor constante simbolice predefinite: EOF, M_PI, INT_MAX,
INT_MIN. Aceste constante simbolice sunt definite n fiiere header (de tip h) : EOF n
stdio.h, M_PI n math.h.
Definirea unei constante simbolice se face utiliznd directiva #define astfel:
#define identificator [text]
Exemple:
#define begin {
#define end }
#define N 100

// unde apare begin acesta va fi nlocuit cu {


// unde apare end acesta va fi nlocuit cu }
// unde apare N acesta va fi nlocuit cu 100

Tipul constantelor C rezult din forma lor de scriere, n concordan cu tipurile de date
fundamentale.
n C++ se prefer alt definire pentru constante simbolice, utiliznd cuvntul cheie const.
Pentru a face diferenierea dintre variabile i constante este de preferat ca definirea
constantelor s se fac pentru scrierea acestora cu majuscule.
Exemple:
const double PI = 3.1415;
const int LIM = 10000;

Variabile
Variabila este o entitate folosit pentru memorarea unei valori de un anumit tip, tip asociat
variabilei. O variabil se caracterizeaz prin nume, tip, valoare i adres:
Orice variabil are un nume (identificator), exemplu: raza, area, varsta, nr. Numele
identific n mod unic fiecare variabil permind utilizarea acesteia, cu alte cuvinte,
numele unei variabile este unic (nu pot exista mai multe variabile cu acelai nume n
acelai domeniu de definiie)
Orice variabil are asociat un tip de date. Tipul poate fi orice tip fundamental sau
derivate, precum i tipuri definite de utilizator.
O variabil poate stoca o valoare de un anumit tip. De menionat c n majoritatea
limbajelor de programare, o variabil asociat cu un anumit tip poate stoca doar valori
aparinnd acelui tip. De exemplu, o variabil de tipul int poate stoca valoarea 123, dar
nu irul Hello.
Oricrei variabile i se aloc (rezerv) un spaiu de memorie corespunztor tipului
variabilei. Acest spaiu este identificat printr-o adres de memorie.

Pentru a folosi o variabil trebuie ca mai nti s i declarm numele i tipul, folosind una din
urmtoarele sintaxe:
tip nume_variabila;
// Declar o variabil de un anumit tip
tip nume_variabila1, nume_variabila2,...;
// Declaraie multipl pentru mai multe variabile de acelai tip
tip var-name = valoare_iniiala;
// Declar o variabil de un anumit tip i i atribuie o valoare iniial
tip nume_variabila1 = valoare_iniiala1, nume_variabila2 = valoare_iniiala2, ... ;
// Declar mai multe variabile unele putnd fi iniializate, nu e obligatoriu s fie toate!
Sintetiznd, definirea variabilelor se face astfel:
Tip lista_declaratori;
lista_declaratori cuprinde unul sau mai multi declaratori, desprii prin virgul
declarator poate fi:
nume_variabila sau
nume_variabila = expresie_de_initializare
n expresie_de_initializare pot apare doar constante sau variabile iniializate!
Exemple:
int sum;
// Declar a variabil sum de tipul int
int nr1, nr2;
// Declar dou variabile nr1 i nr2 de tip int
double media;
// Declar a variabil media de tipul double
int height = 20;
/* Declar a variabil de tipul int i i atribuie o
valoare iniial */
char c1;
// Declar o variabil c1 de tipul char
char car1 = 'a', car2 = car1 + 1;
// car2 se initializeaza cu 'b'
float real = 1.74, coef; /*Declar dou variabile de tip float prima din
ele este i iniializat*/

n definirea tip lista_declaratori; tip poate fi precedat sau urmat de cuvntul cheie const, caz n
care variabilele astfel definite sunt de fapt constante ce trebuie s fie iniializate i care nu-i
mai pot modifica apoi valoarea:
const int coef1 = -2, coef2 = 14;
coef1 = 5; /* modificarea valorii variabilei declarate const e gresita,
apare eroare la compilare!! */

Odat ce o variabil a fost definit i putem atribui sau reatribui o valoare folosind operatorul de
atribuire "=".
Exemple:
int number;
nr = 99;
//atribuie valoarea ntreag 99 variabilei nr
nr = 88;
//i reatribuie valoarea 88
nr = nr + 1;
//evalueaz nr+1 i atribuie rezultatul lui nr
int sum = 0;
int nr;
//ERROR: O variabil cu numele nr e deja definit
sum = 55.66;
// WARNING: Variabila sum este de tip int
sum = "Hello";
/* ERROR: Variabila sum este de tip int. Nu i se poate
atribui o valoare ir */

Observaii:
O variabil poate fi declarat o singur dat.
n fiiere cu extensia cpp putem declara o variabil oriunde n program, atta timp ct este
declarat nainte de utilizare.
Tipul unei variabile nu poate fi schimbat pe parcursul programului.
Numele unei variabile este un substantiv, sau o combinaie de mai multe cuvinte. Prin
convenie, primul cuvnt este scris cu liter mic, n timp ce celelalte cuvinte pot fi scrise cu
prima liter mare, fr spaii ntre cuvinte. Exemple: dimFont, nrCamera, xMax, yMin,
xStangaSus sau acestaEsteUnNumeFoarteLungDeVariabila.
Comentariile
Comentariile sunt utilizate pentru documentarea i explicarea logicii i codului programului.
Comentariile nu sunt instruciuni de programare i sunt ignorate de compilator, dar sunt foarte
importante pentru furnizarea documentaiei si explicaiilor necesare pentru nelegerea
programului nostru de ctre alte persoane sau chiar i de noi nine peste o sptmn.
Exist dou tipuri de comentarii:
Comentarii Multi-linie:
ncep cu /* i se termin cu */, i se pot ntinde pe mai multe linii
Comentarii n linie:
ncep cu // i in pn la sfritul liniei curente.
Exemple:
/* Acesta este
un comentariu n C */
// acesta este un alt comentariu C (C++)

n timpul dezvoltrii unui program, n loc s tergem o parte din instruciuni pentru totdeauna,
putem s le comentm astfel nct, s le putem recupera mai trziu dac vom avea nevoie.
Operatori, operanzi, expresii
Limbajul C se caracterizeaz printr-un set foarte larg de operatori.
Operatorii sunt simboluri utilizate pentru precizarea operaiilor care trebuie executate asupra
operanzilor.
Operanzii pot fi: constante, variabile, nume de funcii, expresii.
Expresiile sunt entiti construite cu ajutorul operanzilor i operatorilor, respectnd sintaxa
(regulile de scriere) i semantica (sensul, nelesul) limbajului. Cea mai simpl expresie este cea
format dintr-un singur operand.
Cu alte cuvinte, putem spune c o expresie este o combinaie de operatori ('+', '-','*', '/', etc.) i
operanzi (variabile sau valori constante), care poate fi evaluat ca avnd o valoare fix, de un
anumit tip.
Expresiile sunt de mai multe tipuri, ca i variabilele: 3*x+7, x<y etc.
La evaluarea expresiilor se ine cont de preceden i asociativitatea operatorilor!
Exemple
1 + 2 * 3

// rezult int 7

int sum, number;


sum + number;

// evaluat la o valoare de tip int

double princ, rata;


princ * (1 + rata);

// evaluat la o valoare de tip double

Operatorii
Clasificarea operatorilor se poate face:
dup numrul operanzilor prelucrai:
unari
binari
ternari - cel condiional;
dup ordinea de succedare a operatorilor i operanzilor:
prefixati
infixati
postfixati
dup tipul operanzilor i al prelucrrii:
aritmetici
relaionali
logici
la nivel de bit.

Operatorii se mpart n clase de preceden, fiecare clas avnd o regul de asociativitate, care
indic ordinea aplicrii operatorilor consecutivi de aceeai preceden (prioritate). Regula de
asociativitate de la stnga la dreapta nseamn c de exemplu urmtoarea expresie 1+2+3-4 este
evaluat astfel ((1+2)+3)-4.

Tabelul operatorilor C indic att regula de asociativitate, implicit de la stnga la dreapta (s-a
figurat doar unde este dreapta-stnga), ct i clasele de preceden, de la cea mai mare la cea
mai mic preceden:

Operator
()
[]
.
->
-++

Semnificaie

Utilizare

paranteze
indexare
selecie
selecie indirect
postdecrementare
postincrementare

(e)
t[i]
s.c
p->c
a-a++

schimbare semn
plus unar ( fr efect)
predecrementare
preincrementare
negaie logic
complementare ( negare bit cu bit )
adresare indirect
preluare adres
determinare dimensiune ( n octei )
conversie de tip ( cast )

-v
+v
--a
++a
!i
~i
*p
&a
sizeof(x)
(d) e

*
/
%

nmulire
mprire
rest mprire ( modulo )

v1 * v2
v1 / v2
v1 % v2

+
-

adunare
scdere

v1 + v2
v1 - v2

<<
>>

deplasare stnga
deplasare dreapta

i1 << i2
i1 >> i2

<
<=
>
>=

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

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

==
!=

egal
diferit

v1 == v2
v1 != v2

&

i pe bii

i1 & i2

+
-++
!
~
*
&
sizeof
()

Asociativitate

dreapta - stnga

sau exclusiv pe bii

i1 ^ i2

sau pe bii

i1 | i2

&&

i logic ( conjuncie )

i1 && i2

||

sau logic ( disjuncie )

i1 || i2

?:

operator condiional ( ternar )

expr ? v1 : v2

atribuire
variante ale
operatorului de atribuire

a=v
a *= v

secveniere

e1, e2

=
*= /= %=
+= -=
&= ^= |=
<<= >>=
,

Legend:
a - variabila ntreag sau real
c - cmp
d - nume tip
e - expresie
f - nume de funcie
x - nume tip sau expresie

dreapta - stnga
dreapta - stnga

i - ntreg
v - valoare ntreag sau real
p - pointer
s - structur sau uniune
t - tablou

Operatorii aritmetici
C suport urmtorii operatori aritmetici pentru numere de tip: short, int, long, long long, char
(tratat ca 8-bit signed integer), unsigned short, unsigned int, unsigned long, unsigned long long,
unsigned char, float, double i long double.
expr1 i expr2 sunt dou expresii de tipurile enumerate mai sus.

Operator

Semnificaie

Utilizare

Exemple

schimbare semn

-expr1

-6
-3.5

+expr1

+2
+2.5

nmulire

expr1 * expr2

2 * 3 6;
3.3 * 1.0 3.3

mprire

expr1 / expr2

1 / 2 0;
1.0 / 2.0 0.5

rest mprire ( modulo )

expr1 % expr2

5 % 2 1;
-5 % 2 -1

adunare

expr1 + expr2

1 + 2 3;
1.1 + 2.2 3.3

+
*
/

%
+

plus unar ( fr efect)

scdere

expr1 - expr2

1 - 2 -1;
1.1 - 2.2 -1.1

Este important de reinut c int / int produce un int, cu rezultat trunchiat, i anume partea
ntreag a mpririi: 1/2 0 (n loc de 0.5), iar operatorul modulo (% ) este aplicabil doar
pentru numere ntregi.
n programare, urmtoarea expresie aritmetic:

Trebuie scris astfel: (1+2*a)/3 + (4*(b+c)*(5-d-e))/f - 6*(7/g+h). Simbolul pentru nmulire '*' nu se
poate omite (cum este n matematic).
Ca i matematic, nmulirea i mprirea au preceden mai mare dect adunarea i scderea.
Parantezele sunt ns cele care au cea mai mare preceden.
Depirile la calculele cu reali sunt semnalate, dar nu i cele de la calculele cu ntregi (valoarea
rezultat este trunchiat). Se semnaleaz, de asemenea, eroarea la mprirea cu 0.
Operatori relaionali i logici
Deseori, e nevoie s comparm dou valori nainte s decidem ce aciune s realizm. De
exemplu, dac nota este mai mare dect 50 afieaz "Admis". Orice operaie de comparaie
implic doi operanzi ( x <= 100 )
n C exist ase operatori de comparaie (mai sunt numii i operatori relaionali):

Operator

Semnificaie

Utilizare

Exemple (x=5, y=8)

==

egal cu

expr1 == expr2

(x == y) false

!=

diferit

expr1 != expr2

(x != y) true

>

mai mare

expr1 > expr2

(x > y) false

>=

mai mare egal

expr1 >= expr2

(x >= 5) true

<

mai mic

expr1 < expr2

(y < 8) false

<=

mai mic egal

expr1 >= expr2

(y <= 8) true

Aceste operaii de comparaie returneaz valoarea 0 pentru fals i o valoare diferit de zero
pentru adevrat.
Convenie C:
Valoarea 0 este interpretat ca fals i orice valoare diferit de zero ca adevrat.

n C exist patru operatori logici:

Operator

Semnificaie

Utilizare

Exemple (expr1=0,
expr2=1)

&&

i logic

expr1 && expr2

||

sau logic

expr1 || expr2

Diferit de 0

negaie logic

!expr1

Diferit de 0

sau exclusiv logic

expr1 ^ expr2

Tabelele de adevr sunt urmtoarele:


AND
(&&)

true

false

true
false

true
false

false
false

OR (||)

true
false

true
true
true

NOT true
(!)

false

false true
XOR
(^)

false
true
false

true

false

true false true


false true false

Este incorect s scriem 1 < x < 100 , n loc de aceasta spargem n dou operaii de comparaie
x>1, x < 100, pe care le unim cu un operator logic I: (x > 1) && (x < 100).
Exemple:
// Returneaz true dac x este ntre 0 i 100 (inclusiv)
(x >= 0) && (x <= 100)
// greit 0 <= x <= 100
// Returneaz true dac x nu este ntre 0 i 100 (inclusiv)
(x < 0) || (x > 100)
//sau
!((x >= 0) && (x <= 100))
/* Returneaz true dac year este bisect. Un an este bisect dac este
divizibil cu 4 dar nu cu 100, sau este divisibil cu 400.*/
((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)

Operatorii de atribuire
Pe lng operatorul de atribuire '=' descris mai sus, limbajul C mai pune la dispoziie aa numiii
operatori de atribuire compui:

Operator
=

Semnificaie
atribuire

Utilizare
var = expr

Exemple
x=5

+=

var = var + expr

-=

var = var expr

*=

var = var * expr

/=

var = var / expr

%=

var = var % expr

var + = expr

x+=5
(echivalent cu x=x+5)

var - = expr

x-=5
(echivalent cu x=x-5)

var * = expr

x*=5
(echivalent cu x=x*5)

var / = expr

x/=5
(echivalent cu x=x/5)

var %= expr

x%=5
(echivalent cu x=x%5)

Limbajul C mai introduce i cei doi operatori aritmetici pentru incrementare '++' i
decrementare '--' cu 1:

Operator
--var

var--

Semnificaie
predecrementare

post decrementare

Exemple
y = --x;

y=x--;

++var

preincrementare

y=++x;

var++

post incrementare

y=x++;

Rezultat
echivalent cu
x=x-1;
y=x;
echivalent cu
y=x;
x=x-1;
echivalent cu
x=x+1; y=x;
echivalent cu
y=x;
x=x+1;

Exemple:
int i, j, k;
// variabilele sunt initializate cu aceeasi valoare, 0
i = j = k = 0;
float lungime, latime, inaltime, baza, volum;
// calculeaza baza si volumul unui paralelipiped
volum = inaltime * ( baza = lungime * latime );

Operatorul sizeof
Rezultatul aplicrii acestui operator unar este un ntreg reprezentnd numrul de octei
necesari pentru stocarea unei valori de tipul operandului sau pentru stocarea rezultatului

expresiei dac operandul este o expresie. Operatorul are efect la compilare, pentru c atunci se
stabilete tipul operanzilor.
Sintaxa:
sizeof (tip)
sizeof (expresie)
Exemple:
sizeof('a')
sizeof(int)
sizeof(2.5 + 3)

// 1
// 2
// 4??

Conversii de tip. Operatorul de conversie explicita (cast)


Conversia de tip ia un operand de un anumit tip i returneaz o valoare echivalent de un alt
tip.
Exist dou tipuri de conversii de tip:
1. Implicit, realizat automat de compilator
2. Explicit, utiliznd operatorul unar de conversie de tip n forma (tip_nou) operand
Conversii de tip implicite
n limbajul C, dac atribuim o valoare double value unei variabile ntregi, compilatorul
realizeaz o conversie de tip implicit, returnnd o valoare ntreag. Partea fracional se va
pierde. Unele compilatoare genereaz o avertizare (warning) sau o eroare "possible loss in
precision"; altele nu.
La evaluarea expresiilor pot apare conversii implicite:
dac o expresie are doar operanzi ntregi, ei se convertesc la int
dac o expresie are doar operanzi reali sau intregi, ei se convertesc la double.
dac o expresie are operanzi de tipuri diferite, compilatorul promoveaz valoarea tipului
mai mic la tipul mai mare. Operaia se realizeaz apoi n domeniul tipului mai mare.De
exemplu, int / double double / double double. Deci, 1/2 0, 1.0/2.0 0.5, 1.0/2 0.5, 1/2.0
0.5.
n expresia variabila=expresie se evalueaz prima dat expresia, fr a ine cont de tipul
variabilei; dac tipul rezultatului obinut este diferit de cel al variabilei, se realizeaz
conversia implicit la tipul variabilei astfel:
De exemplu,

Tip
int
double
mixt

Exemplu
2+3
2.2 + 3.3
2 + 3.3

Operaie
int 2 + int 3 int 5
double 2.2 + double 3.3 double 5.5
int 2 + double 3.3 double 2.0 + double 3.3 double 5.3

int
double
mixt

1/2
1.0 / 2.0
1 / 2.0

int 1 / int 2 int 0


double 1.0 / double 2.0 double 0.5
int 1 / double 2.0 double 1.0 + double 2.0 double 0.5

Exemple conversii implicite:


int i; char c = 'c';
i = 2.9;
//
f = 'A';
//
i = 30000 + c;
//
i = 30000 + 10000;//
l = 30000 + 10000;
l=30000u+10000;
l=30000l+10000;

long l; float f;
2.9 e convertit implicit la int, deci i va fi 2
f va fi 65.0 ( codul ASCII )
expresia se calculeaza in domeniul int, i va fi 30099
calcul in dom. int, depasire nesemnalata, i e 25536
// -25536 va fi convertit la long
// rezultat corect
// rezultat corect

Conversii de tip explicite


Operatorul de conversie explicit ( cast ) se utilizeaz atunci cnd se dorete ca valoarea unui
operand ( expresie ) s fie de un alt tip dect cel implicit. Operatorul este unar, are prioritate
ridicat si are sintaxa: ( tip ) expresie
Exemple conversii explicite
float r;
r = 5 / 2;

// impartirea se face in domeniul int, deci r va fi 2.0

r = (float) 5 / 2; /* r va fi 2.5, pentru ca primul operand este de tip


float calculul se face n domeniul real */
int x = (int) r;

//x va fi 2

C++ support i conversii de tip de genul new-type(operand):


medie = double(sum) / 100;

// echivalent cu (double)sum / 100

Operatorul condiional
Operatorul condiional ? : este singurul operator ternar. Are prioritatea mai ridicat doar dect
a operatorilor de atribuire i a celui secvential, iar asociativitatea este de la dreapta spre stanga.
El se folosete n situaiile n care exist dou variante de obinere a unui rezultat, dintre care se
alege una singur, funcie de ndeplinirea sau nendeplinirea unei condiii. Cei trei operanzi sunt
expresii, prima reprezentand condiia testat.
expr0 ? expr1 : expr2
Dac valoarea expr0 este adevarat ( !=0 ), se evalueaz expr1, altfel expr2, rezultatul expresiei
evaluate fiind rezultatul final al expresiei condiionale.
Exemple:
/* Expresia de mai jos determin valoarea maxim dintre a si b, pe care o

memoreaz n max:*/
max = a > b ? a : b;
/* Funcie de ora memorat n variabila hour, funcia
corespunztor.
Evaluare dreapta -> stnga a expresiilor condiionale
puts( hour < 0 || hour > 24 ? "Ora invalida" : hour <
: hour < 18 ? "Buna ziua!" : hour < 22 ? "Buna seara"

puts va tipri mesajul


multiple */
12 ? "Buna dimineata!"
: "Noapte buna!");

Operatorul secvenial
Operatorul secvenial , ( virgul ) este cel cu prioritatea cea mai sczut. Se folosete atunci
cnd sintaxa limbajului impune prezena unei singure expresii, iar prelucrarea presupune
evaluarea a dou sau mai multe expresii; acestea se evalueaz de la stnga la dreapta, iar
rezultatul ntregii expresii este cel al ultimei expresii ( exprn ):
expr1, expr2, ..., exprn
Exemplu:
/* Expresia de mai jos memoreaz n max valoarea maxim dintre a si b,
realiznd i ordonarea descresctoare a acestora (le interschimb dac
a<b). A se observa c interschimbarea presupune utilizarea unei variabile
auxiliare). Operatorul secvenial e necesar pentru a avea o singur
expresie dup : */
int a, b, aux, max;
max = a >= b ? a : (aux = b, b = a, a = aux);
//

Das könnte Ihnen auch gefallen