Sunteți pe pagina 1din 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-in-
time, 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 > gcc Hello.c -o Hello.exe


executabil Hello.exe
n Unix or Mac (Bash shell) - genereaz fiierul $ gcc Hello.c -o Hello
executabil 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) > Hello
n Unix or Mac (Bash shell) - Rulare "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
Cod executabil

Biblioteci dinamice (.dll, .so) Loader Pas 5: ncrcare


ncancrcaren
RUN
crcarePreproces
DATE INTRARE CPU are
Pas 6: Execuie

DATE IEIRE

Tabelul conine o descriere sintetic a pailor detaliai:

Pas Descriere
1 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

2 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.

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

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


pentru a furniza fiierul executabil (.exe).

5 ncrcarea codului executabil n memoria calculatorului (RAM).


6 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
1 #include<stdio.h>
void main(void)
{
printf(Hello World!);
}

2 fr void n antetul #include<stdio.h>


main-ului void main()
{
printf(Hello World!);
}
3 - fr warning la #include<stdio.h>
compilare n int main()
Code::Blocks {
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 76543210
Valoare 01000001
biti

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 extern double


char register float
unsigned typedef static
do else for
while struct goto
switch union return
case sizeof default
short break if
long auto continue

Standardul ANSI C a mai adugat:

signed const void


enum volatile

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 Valoare


minim Maxim

int ntreg cu semn (cel 4 (2) -2147483648 2147483647


signed int puin 16 bii) (=231-1)

unsigned int ntreg fr semn (cel 4 (2) 0 4294967295


puin 16 bii) (=232-1 )

char Caracter 1
Numere (poate fi cu semn
ntregi sau fr semn,
depinde de
implementare)

signed char Caracter sau ntreg 1 -128 127


mic cu semn (=27-1 )
(garanteaz c e cu
semn)
unsigned char Caracter or sau 1 0 255
ntreg mic fr semn (=28-1 )
(garanteaz c e
fr semn)

short ntreg scurt cu semn 2 -32768 32767


short int (cel puin 16 bii)
signed short (=215-1 )
signed short int

unsigned short ntreg scurt fr 2 0 65535


unsigned short int semn (cel puin 16 (=216-1 )
bii)

long ntreg lung cu semn 4 (8) -2147483648 2147483647


long int (cel puin 32 bii)
signed long (=231-1 )
signed long int
unsigned long ntreg lung fr 4 (8) 0 4294967295
unsigned long int semn (cel puin 32 (=232-1 )
bii)

long long ntreg foarte lung cu 8 -263 (=263-1)


long long int semn (cel puin 64
signed long long bii) (de la
signed long long int standardul C99)

unsigned long long ntreg foarte lung 8 0 264-1


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

float Numr n virgul 4 3.4e-38 3.4e38


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

double Numr n virgul 8 1.7e-308 1.7e308


mobil dubl
precizie, 15
Numere cifre(IEEE 754
Reale format virgul
mobil dubl
precizie)

long double Numr lung n 12 (8) 3.4E-4932 1.1E4932


virgul mobil dubl
precizie, 19
cifre(IEEE 754
format virgul
mobil cvadrupl
precizie)

bool Valoare boolean 1 false (0) true (1 sau


care poate fi fie diferit de
Numere
true fie false zero)
booleene (de la standardul
C99)

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 // int
65000 // long
32780 // long
32780u // unsigned int
1234; // Decimal
01234; // Octal 1234, Decimal 2322
0x1abc; // hexadecimal 1ABC, decimal 15274
0b10001001; // binar (doar n unele compilatoare)
12345678L; // Sufix 'L' pentru long
123UL; // int 123 auto-cast la long 123L
987654321LL; // 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.2e3 // 1.2*103
-5.5E-6 // -5.5*10-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 Constante de tip Constante de tip long


float double 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 Descriere Hexa (Decimal)


\n Linie nou (Line feed) 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 { // unde apare begin acesta va fi nlocuit cu {
#define end } // unde apare end acesta va fi nlocuit cu }
#define N 100 // 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 Asociativitate

() paranteze (e)
[] indexare t[i]
. selecie s.c
-> selecie indirect p->c
-- postdecrementare a--
++ postincrementare a++

- schimbare semn -v
+ plus unar ( fr efect) +v
-- predecrementare --a
++ preincrementare ++a
! negaie logic !i dreapta - stnga
~ complementare ( negare bit cu bit ) ~i
* adresare indirect *p
& preluare adres &a
sizeof determinare dimensiune ( n octei ) sizeof(x)
() conversie de tip ( cast ) (d) e

* nmulire v1 * v2
/ mprire v1 / v2
% rest mprire ( modulo )
v1 % v2
+ adunare v1 + v2
- scdere v1 - v2
<< deplasare stnga i1 << i2
>> deplasare dreapta i1 >> i2
< mai mic v1 < v2
<= mai mic sau egal v1 <= v2
> mai mare
v1 > v2
>= mai mare sau egal
v1 >= v2
== egal v1 == v2
!= diferit v1 != v2
& i pe bii i1 & i2
^ 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 dreapta - stnga
= atribuire a=v
*= /= %= a *= v
variante ale dreapta - stnga
+= -=
operatorului de atribuire
&= ^= |=
<<= >>=
, secveniere e1, e2

Legend:
a - variabila ntreag sau real i - ntreg
c - cmp v - valoare ntreag sau real
d - nume tip p - pointer
e - expresie s - structur sau uniune
f - nume de funcie t - tablou
x - nume tip sau expresie

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


-6
- schimbare semn -expr1
-3.5
plus unar ( fr efect) +2
+ +expr1
+2.5
2 * 3 6;
* nmulire expr1 * expr2
3.3 * 1.0 3.3
/ 1 / 2 0;
mprire expr1 / expr2
1.0 / 2.0 0.5
5 % 2 1;
% rest mprire ( modulo ) expr1 % expr2
-5 % 2 -1
+ 1 + 2 3;
adunare expr1 + expr2
1.1 + 2.2 3.3
1 - 2 -1;
- scdere expr1 - expr2
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 0
|| sau logic expr1 || expr2 Diferit de 0
! negaie logic !expr1 Diferit de 0
^ sau exclusiv logic expr1 ^ expr2 1

Tabelele de adevr sunt urmtoarele:

AND true false NOT true false


(&&) (!)
true true false false true
false false false
XOR true false
OR (||) true false (^)
true true true true false true
false true false 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 Utilizare Exemple


= atribuire var = expr x=5
var + = expr x+=5
+= var = var + expr
(echivalent cu x=x+5)
var - = expr x-=5
-= var = var expr
(echivalent cu x=x-5)
var * = expr x*=5
*= var = var * expr
(echivalent cu x=x*5)
var / = expr x/=5
/= var = var / expr
(echivalent cu x=x/5)
var %= expr x%=5
%= var = var % expr
(echivalent cu x=x%5)

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

Operator Semnificaie Exemple Rezultat


echivalent cu
predecrementare
--var y = --x; x=x-1;
y=x;
echivalent cu
post decrementare
var-- y=x--; y=x;
x=x-1;
echivalent cu
++var preincrementare y=++x;
x=x+1; y=x;
echivalent cu
var++ post incrementare y=x++; 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') // 1
sizeof(int) // 2
sizeof(2.5 + 3) // 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 Exemplu Operaie


int 2+3 int 2 + int 3 int 5
double 2.2 + 3.3 double 2.2 + double 3.3 double 5.5
mixt 2 + 3.3 int 2 + double 3.3 double 2.0 + double 3.3 double 5.3
int 1/2 int 1 / int 2 int 0
double 1.0 / 2.0 double 1.0 / double 2.0 double 0.5
mixt 1 / 2.0 int 1 / double 2.0 double 1.0 + double 2.0 double 0.5

Exemple conversii implicite:

int i; char c = 'c'; long l; float f;


i = 2.9; // 2.9 e convertit implicit la int, deci i va fi 2
f = 'A'; // f va fi 65.0 ( codul ASCII )
i = 30000 + c; // expresia se calculeaza in domeniul int, i va fi 30099
i = 30000 + 10000;// calcul in dom. int, depasire nesemnalata, i e 25536
l = 30000 + 10000; // -25536 va fi convertit la long
l=30000u+10000; // rezultat corect
l=30000l+10000; // 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 puts va tipri mesajul


corespunztor.
Evaluare dreapta -> stnga a expresiilor condiionale multiple */
puts( hour < 0 || hour > 24 ? "Ora invalida" : hour < 12 ? "Buna dimineata!"
: hour < 18 ? "Buna ziua!" : hour < 22 ? "Buna seara" : "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);

//