Вы находитесь на странице: 1из 49

LICEUL COLEGIUL NATIONAL GEORGE COSBUC MOTRU

PROIECT ATESTAT
INFORMATICA

ELEV: SFIA ROXANA


TEMA: PROGRAMARE C/C++
CLASA: A XII-A C
PROFESOR COORDONATOR: CIOCAN NATALIA

TEMA:
PROGRAMARE C/C++

CUPRINS
1. Limbaje de programare..
pag. 4
2. Limbajul C/C++
pag. 6
3. Caracteristicile limbajului C++
..... pag. 8
4. Procesul dezvoltari unui program C++
..... pag. 8
5. Bibliografie
. pag. 38

Inainte 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
programare

de

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,

ce

ordine

cu

ce

date.

Specificarea

const

practic

ntocmirea/scrierea programelor necesare ("programare").


Orice limbaj (natural sau artificial) presupune definirea unui set de
reguli sintactice i semantice.
Sintaxa

reprezint

dintr-un

limbaj.

un
n

set

de

reguli

ce

guverneaz

alctuirea

propoziiilor

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
nlocuiete

codarea

mnemonic

(cum

ar

limbaj main.
fi ADD)

cu

Asamblorul

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-tiinifce
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

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

structura secvenial - secvena;


structura alternativ - decizia;
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
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

standard

fost

Organization for

adoptat

de International

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.

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, fexibil
produce programe efciente ( 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
Instruciun
e1

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)

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
DevCpp,

MS

Visual

Studio,

Environment)

Eclipse

precum

CodeBlocks,

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 linkeditarea - 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 IDEului de exemplu
Compile,

Build

sau

linie

de

comand,

cu

compilatorul GNU GCC:

n Windows (CMD shell) - genereaz


fierul
executabil
Hello.exe
n Unix or Mac
(Bash shell) genereaz fierul executabil
Hello
Etapa 3: Execuia programului - Run

> gcc Hello.c -o Hello.exe


$ gcc Hello.c -o Hello

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

Cod
executabil
Biblioteci dinamice (.dll, .so)
ncrcare
DATE INTRARE

Loader

CPU
Execuie

Pas 5:

RUN

Pas 6:

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, #defne n C). Aceste directive indic operaii
(includerea unui alt fiier, nlocuire de text etc) care se vor
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).

3
4
5

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
defniii de
tipuri
prototipuri de funcii - tipul funciei i tipurile parametrilor
funciei
defniii de variabile
externe defniii 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

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
limbajului C

baz

ale

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 7 6 5 4 3 2 1 0
01000001
Valoare
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

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.

Identifcatorii pot fi :
nume utilizator - nume de variabile, constante
simbolice, funcii, tipuri, structuri, uniuni - este bine
sa fe alese ct mai sugestiv pentru scopul utilizrii;
cuvinte cheie ale limbajului C - pot fi folosite doar cu
nelesul cu care au fost defnite
cuvinte rezervate - nelesul poate fi modifcat, 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

fie

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
exemplu,

vom

spune

identificatorului

nrStudenti

respectiv,

de

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
foat

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
date

de

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 10E308 i 10E+308 iar precizia este de 15 cifre zecimale.

Tabelul

urmtor

respective

maxim

prezint

dimensiunea

pentru tipurile

tipic,

valorile

primitive (n cazul

minim

general). nc

dat, dimensiunea este dependent de implementarea C folosit.

i
o

Categori Tip
e
int
signed int
unsigned int
char

Numere
ntregi

signed char

Descriere

Octe Valoare
i
minim

ntreg cu semn
(cel
puin 16 bii)
ntreg fr semn
(cel
puin 16 bii)
Caracter
(poate fi cu
semn sau fr
semn,
depinde de
implementare
)
Caracter
sau
ntreg
mic cu semn
(garanteaz c
e cu semn)

4 (2)
4 (2)

Valoare
Maxim

21474836
31
2147483648 47 (=2 1)
0
42949672
32
95 (=2 -1
)

-128

127
7
(=2 -1 )

unsigned char

short
short int
signed
short
signed
unsigned short
unsigned short
int

Caracter or sau
1
ntreg mic fr
semn
(garanteaz c e
fr semn)
ntreg scurt cu
2
semn
(cel puin 16 bii)

255
8
(=2 -1 )

-32768

32767

ntreg scurt fr
semn (cel puin
16 bii)

15

(=2 -1 )

65535
16
(=2 1)

long
long int
signed
long
signed
unsigned
long
unsigned long
int

ntreg lung cu
4 (8)
semn
(cel puin 32 bii)

214748364
2147483648 7

ntreg lung fr
semn (cel puin
32 bii)

4 (8)

42949672
32
95 (=2 -1
)

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

ntreg foarte lung


cu
semn (cel puin
64 bii) (de la
standardul
ntreg foarte lung
fr semn (cel
puin
64 bii) (de la
standardul
Numr n virgul
mobil, 7
cifre(IEEE
754 format
virgul
mobil simpl
Numr n virgul
mobil
dubl
precizie,
15
cifre(IEEE
754 format
virgul
mobil lung n
Numr
virgul mobil
dubl precizie,
19 cifre(IEEE
754
format virgul
mobil cvadrupl

-263

(=2 -1)

2 -1

3.4e-38

3.4e38

1.7e-308

1.7e308

12 (8)

3.4E-4932

1.1E4932

float

double

Numer
e
Real
e
long double

31

(=2 -1 )

63

64

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

bool

Numer
e
boolee
ne

true (1 sau
diferit de
zero)

false (0)

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
hexadecimal i

valoare

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;

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

int
long
long
unsigned int
Decimal
Octal 1234, Decimal 2322

0x1abc;
0b10001001;
12345678L;
123UL;
987654321LL;

//
//
//
//
//

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
foa

Constante
de tip
doubl

Constante de
tip long
doubl

.241f

.241

.241l

12.5e5f

12.5e5

12.5e5l

1.f

1.

1.L

98.E12f

98.E-12

98.E12L

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

Descrie
re feed)
Linie nou (Line

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

caractere

de

Valorile ir de caractere sunt compuse din zero sau mai multe


caractere precizate ntre ghilimele.

Exempl
e:
"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 \.

Exempl
e:
"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();

Consta
nte
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

math.h.

Definirea unei constante simbolice se face utiliznd directiva


#define astfel:
#defne
identificator [text]
Exempl
e:
#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

constante

ca

este

de

preferat

scrierea acestora cu majuscule.


Exempl
e:

const double PI = 3.1415;


const int LIM = 10000;

face

diferenierea

dintre

variabile

definirea constantelor s se fac pentru

Variab
ile

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!
Exempl
e:
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 */

Observa
ii:
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.

Comentari
ile

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

asociativitatea operatorilor!

Exempl
e
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

Operator
ii
Clasifcarea operatorilor se poate face:
dup numrul operanzilor prelucrai:
unari
binari
ternari - cel condiional;
dup ordinea de succedare a operatorilor i operanzilor:
prefxati
infixati
postfxati
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:

Operato
r
(
)
[
]
.
->
-+
+
-+
+
!
~
*
&
sizeo
f
()
*
/
%

Semnificaie
parante
ze
indexare
selecie
selecie indirect
postdecrement
are
postincrement
schimbare
semn
plus unar ( fr
efect)
predecrement
are
preincrementa
re
negaie
logic
complementare ( negare bit
cu bit )
adresare
nmulire
mprire
rest mprire ( modulo )

+
-

adunare
scdere

<
<
>
<
<
=
>
>
=
=

deplasare
stnga
deplasare
mai mic
mai mic sau egal
mai mare
mai mare sau egal

Utilizare Asociativit
ate

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

+v
--a
++a
!i
~i
*p
&a
sizeof(
x) (d) e
v1 * v2
v1 / v2
v1
%
v2
v1 +
v2 v1
-i1v2
<<
i2 i1
>>
v1 <i2

egal
diferi
t
i pe bii

v2 v1
<= v2
v1 >
v2 v1
v1 ==
v2 v1 !
=
i1 v2
& i2

sau exclusiv pe bii

i1 ^ i2

sau pe bii

i1 | i2

&&

i logic ( conjuncie )

i1 && i2

||

sau logic ( disjuncie )

i1 || i2

=
!=
&

dreapta stnga

?:
=
*= /=
%=
+=
-=
&= ^=
,

operator condiional ( ternar )

expr ? v1 : v2

atribuire
variante
ale
operatorului de atribuire

a=v
a *= v

secveniere

e1, e2

dreapta stnga
dreapta stnga

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
schimbare semn
plus unar ( fr efect)

Utilizare
-expr1
+expr1

nmulir
e

expr1 *
expr2

mprir
e

expr1 /
expr2

rest mprire (
modulo )

expr1 %
expr2

Exemple
-6
-3.5
+2
+2.
5
2*3
6;
3.3 * 1.0
1/2
0;
1.0 / 2.0
5 % 2 1;
-5 % 2 -1

adunar
e

expr1 +
expr2

1+2
3;
1.1 + 2.2

expr2

scdere

expr1 -

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):

OperatorSemnificaie
y=8)
=
egal cu

Utilizare

Exemple (x=5,

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

=
!
=
>

n C exist patru operatori logici:

OperatorSemnificaie
(expr1=0,
&&

Utilizare

Exemple
expr2=1)
0

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 fals
e
true false
false false

OR (||) true fals

true
false

true
true

true
false

NOT true fals


(!)
e

false true

XOR true fals


(^)
e

true false true


fals true false
e

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:

OperatorSemnificaie
=

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

var - = expr

(echivalent cu
x=5

var * = expr

(echivalent
x*= cu
5

var / = expr

(echivalent
x/=5 cu

var %= expr

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

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

Operato
r
--var

var--

Semnificaie
predecrementare

post decrementare

Exemple
y=
--x;
y=x-;

++var

preincrementare

y=+
+x;

var++

post incrementare

y=x+
+;

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

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:
// 1
// 2
// 4??

sizeof('a')
sizeof(int)
sizeof(2.5 + 3)

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

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,

Ti

Exempl

Opera

int
double
mixt

2+3
2.2 + 3.3
2 + 3.3

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

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
implicite:

conversii

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 newtype(operand):


medie = double(sum) / 100;

// echivalent cu (double)sum / 100

Operatorul
condiional
Operatorul condiinal ? : 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


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


Exempl
u:

/* 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);

Вам также может понравиться

  • Etichete Seturi Mini Sapun 3 Si 5
    Etichete Seturi Mini Sapun 3 Si 5
    Документ1 страница
    Etichete Seturi Mini Sapun 3 Si 5
    DeekyDZ
    Оценок пока нет
  • A Parate
    A Parate
    Документ19 страниц
    A Parate
    DeekyDZ
    Оценок пока нет
  • Curent
    Curent
    Документ21 страница
    Curent
    DeekyDZ
    Оценок пока нет
  • Grupmotor
    Grupmotor
    Документ20 страниц
    Grupmotor
    DeekyDZ
    Оценок пока нет
  • Grupmotor
    Grupmotor
    Документ21 страница
    Grupmotor
    DeekyDZ
    Оценок пока нет
  • Amplificator
    Amplificator
    Документ23 страницы
    Amplificator
    DeekyDZ
    100% (2)
  • Microf Oane
    Microf Oane
    Документ18 страниц
    Microf Oane
    DeekyDZ
    Оценок пока нет
  • Strung Uri
    Strung Uri
    Документ21 страница
    Strung Uri
    DeekyDZ
    Оценок пока нет
  • Tester
    Tester
    Документ22 страницы
    Tester
    DeekyDZ
    Оценок пока нет
  • Tester
    Tester
    Документ22 страницы
    Tester
    DeekyDZ
    Оценок пока нет
  • Masinisincrone
    Masinisincrone
    Документ19 страниц
    Masinisincrone
    DeekyDZ
    Оценок пока нет
  • Aparate
    Aparate
    Документ26 страниц
    Aparate
    DeekyDZ
    Оценок пока нет
  • Tensiuni
    Tensiuni
    Документ14 страниц
    Tensiuni
    DeekyDZ
    Оценок пока нет
  • Aparate
    Aparate
    Документ26 страниц
    Aparate
    DeekyDZ
    Оценок пока нет
  • Aparate
    Aparate
    Документ26 страниц
    Aparate
    DeekyDZ
    Оценок пока нет
  • Memoria Extern A
    Memoria Extern A
    Документ24 страницы
    Memoria Extern A
    DeekyDZ
    Оценок пока нет
  • Aparate
    Aparate
    Документ26 страниц
    Aparate
    DeekyDZ
    Оценок пока нет
  • A Parate
    A Parate
    Документ19 страниц
    A Parate
    DeekyDZ
    Оценок пока нет
  • Aparate
    Aparate
    Документ26 страниц
    Aparate
    DeekyDZ
    Оценок пока нет
  • Strung Uri
    Strung Uri
    Документ21 страница
    Strung Uri
    DeekyDZ
    Оценок пока нет
  • Masinisincrone
    Masinisincrone
    Документ26 страниц
    Masinisincrone
    DeekyDZ
    Оценок пока нет
  • Vector I
    Vector I
    Документ33 страницы
    Vector I
    DeekyDZ
    Оценок пока нет
  • Regulator
    Regulator
    Документ18 страниц
    Regulator
    DeekyDZ
    Оценок пока нет
  • Artafotografica
    Artafotografica
    Документ32 страницы
    Artafotografica
    DeekyDZ
    Оценок пока нет
  • Programarec
    Programarec
    Документ38 страниц
    Programarec
    DeekyDZ
    Оценок пока нет
  • Microf Oane
    Microf Oane
    Документ18 страниц
    Microf Oane
    DeekyDZ
    Оценок пока нет
  • Sistem
    Sistem
    Документ47 страниц
    Sistem
    DeekyDZ
    Оценок пока нет
  • Regulator
    Regulator
    Документ18 страниц
    Regulator
    DeekyDZ
    Оценок пока нет
  • Sistem
    Sistem
    Документ47 страниц
    Sistem
    DeekyDZ
    Оценок пока нет