You are on page 1of 10

I.

Tipuri i variabile
1. Tipuri. Un tip de date este precizat prin: - o mulime finit de valori corespunztoare tipului (constantele tipului) - o mulime de operatori prin care se prelucreaz valorile tipului - o multime de restricii de utilizare a operatorilor. De exemplu tipul ntreg (int) este definit prin: - mulimea valorilor reprezentnd numere ntregi (ntre -32768 i 32767) - mulimea operatorilor : +, -, *, /, % - mulimea restriciilor: pentru operatorul / mpritorul nu poate fi 0, etc. Tipurile pot fi tipuri fundamentale i tipuri derivate. Tipurile fundamentale (predefinite sau de baz sunt: Tipul boolean (bool) Tipul caracter (char) Tipuri ntregi (int, short, long) Tipuri reale (float, double, long double) Tipul vid (void) Tipurile enumerate (enum) Tipurile boolean, caracter, ntreg, real i tipurile enumerate sunt tipuri aritmetice, deoarece valorile lor pot fi interpretate ca numere. Tipurile boolean, caracter, ntreg i enumerrile sunt tipuri ntregi. Tipurile derivate sunt construite pornind de la tipurile fundamentale. Tipurile derivate sunt: tablourile funciile pointerii referinele structurile (sau nregistrrile) uniunile (nregistrrile cu variante) n cele ce urmeaz, vom nelege prin obiect, o zon de memorie. acesta. Declararea unui obiect specific numai proprietile obiectului, fr a aloca memorie pentru

Definirea unui obiect specific proprietile obiectului i aloc memorie pentru obiect. Declararea obiectelor ne permite referirea la obiecte care vor fi definite ulterior n acelai fiier sau n alte fiiere care conin pri ale programului. 2. Tipuri fundamentale. Calculatoarele pot lucra n mod direct cu caractere, ntregi i reali. Acestea sunt tipuri fundamentale (predefinite). 2.1. Booleeni (tipul bool). Valorile asociate tipului boolean sunt valorile true i false. Rezultatele operaiilor logice sunt valori booleene. Funciile care testeaz anumite condiii (predicate) ntorc rezultate de tip boolean. Exemplu: bool par(int n){ return n%2==0;} 2.2. Caracterele (tipul char) Valorile asociate tipului caracter (char) sunt elemente din mulimea caracterelor setul de caractere ASCII. Drept consecin, caracterele pot fi tratate ca ntregi, i invers. Afiarea sau citirea unei variabile de tip char la terminal se face cu descriptorul de format %c. Fiecrei constante caracter i se asociaz o valoare ntreag, valoarea caracterului n setul de caractere ASCII. Pentru reprezentarea de caractere n alt set de caractere (de exemplu Unicode) se folosete tipul wchar_t. Un literal caracter se reprezint prin caracterul respectiv inclus ntre apostrofi (dac este tipribil).

11

Caracterele netipribile se reprezint prin mai multe caractere speciale numite secvene escape. Acestea sunt: \n sfrit de linie (LF) \t tabulare orizontal (HT) \v tabulare vertical (VT) \b revenire la caracterul precedent (BS) \r revenire la nceput de linie (CR) \f avans la pagin nou (FF) \a alarm (BEL) \\ caracterul \ \? caracterul ? \ caracterul \ caracterul \ooo caracterul cu codul octal ooo \xhh caracterul cu codul hexazecimal hh 2.3. ntregii (tipul int). ntregii pot avea 3 dimensiuni: int, short int (sau short) i long int (sau long). Constantele intregi pot fi date in bazele: 10: 8: 16: 257, -65, +4928 0125, 0177 0x1ac, 0XBF3 Afiarea unei variabile de tip int n baza 10 la terminal se face cu descriptorul de format %d sau %i, n baza 8 cu %o, iar n baza 16 cu %x. Calificatorii long, short i unsigned Calificatorul long situat naintea tipului int extinde domeniul tipului ntreg de la (-215,215-1) la (-231, 231-1). Constantele intregi lungi se scriu cu sufixul L: 125436L. Afiarea sau citirea unei variabile de tip long int la terminal se face cu descriptorul de format %ld sau %li n baza 10, %lo n baza 8 i %lx n baza 16. Calificatorul short situat naintea tipului int restrnge domeniul ntregilor. Afiarea sau citirea unei variabile de tip short int la terminal se face cu descriptorul de format %hd sau %hi n baza 10, %ho n baza 8 i %hx n baza 16. Calificatorul unsigned nainte de int deplaseaz domeniul ntregilor (-215,215-1) la (0,216-1). Afiarea sau citirea unei variabile de tip unsigned int la terminal se face cu descriptorul de format %ud sau %ui n baza 10, %uo n baza 8 i %ux n baza 16. Constantele fr semn se specific cu sufixul U sau u. Exist 6 tipuri ntregi, formate folosind calificatorii: { [ signed | unsigned ] } { [ short | long ] } int Avem urmtoarele echivalene: int = signed int short = short int = signed short int long = long int unsigned = unsigned int unsigned short = unsigned short int unsigned long = unsigned long int Literali ntregi fi scrii n: - zecimal - un ir de cifre zecimale, dintre care prima nu este 0.

12

- octal - un ir de cifre octale care ncepe cu cifra 0 - hexazecimal - un ir de cifre hexa care ncepe prin 0x. Un numar negativ este precedat de semnul -. Exist i semnul + unar. Exemple: 125 01473 0x2AFC +645 -8359 Literalii ntregi se pot termina prin u sau U (fr semn) sau l sau L (de tip lung). Dac constanta nu are sufix, atunci ea va aparine primului tip din succesiunea: int, long int, unsigned long int care permite reprezentarea valorii. 2.4. Realii (tipurile float i double). Partea ntreag sau cea fracionar din constanta real poate lipsi: ntreg.fractie sau ntreg. sau .fractie Exemple: 2.25, 1., -.5, +234.5 Constantele reale pot fi exprimate cu mantis i exponent (notaia tiinific): mantisaEexponent = mantisa 10exponent Exemple: 1.5e-3, 0.5E6. Tipul float asigur o precizie de 7 cifre zecimale semnificative i exponentul maxim 38. Reprezentarea se face pe 4 octei. Afiarea unei variabile de tip float la terminal se face cu descriptorii de format %f sau %e. Tipul double este foarte asemntor tipului float, cu deosebirea c se asigur o precizie de 16 cifre zecimale semnificative i exponentul maxim 306. Reprezentarea se face pe 8 octei. Afiarea sau citirea unei variabile de tip double la terminal se face cu descriptorul de format %lf, iar a unei variabile de tip long double cu %Lf. Reprezentarea intern pentru long double se face pe 10 octei. Numerele reale conin punct zecimal i/sau exponent, avnd forma: [<parte ntreaga>][.<parte fracionara>][ E<exponent>] Partea ntreag si partea fracionar pot lipsi, dar nu simultan. Punctul zecimal i exponentul sunt opionale, dar nu simultan. Constanta poate avea un sufix: - f sau F precizeaz o constant de tip float - l sau L precizeaz o constant de tip long double. Exemple: .25 -7.628 15E-3 2.5. Definiri de tip cu typedef. Un tip de date poate avea i un alt nume, prin folosirea declaraiei typedef. De exemplu: typedef int #define intreg int Acelai efect se obine cu directiva define: intreg

2.6. Tipuri enumerate. Folosirea tipului enumerare poate crete claritatea programului, ntruct numele sunt mai semnificative dect valorile care se ascund n spatele lor. Astfel este mai natural folosirea valorilor ROSU, ALB, NEGRU, VERDE pentru a desemna nite culori, dect a valorilor 0, 1, 2, 3. Constantele simbolice pot fi introduse cu macrodefinitii #define. #define FALSE 0 #define TRUE 1 Un tip enumerat folosete n locul valorilor tipului 0,1,2, nume simbolice: enum CULORI {ROSU, VERDE, GALBEN, ALBASTRU, NEGRU};

13

enum boolean {FALSE, TRUE}; Este posibil sa form pentru numele simbolice alte valori ntregi dect 0,1,2, enum ZILE {LUNI=1, MARTI, MIERC, JOI, VIN, SAMB, DUM}; enum escapes {BELL=\a,BACKSPACE=\b,TAB=\t,NEWLINE=\n, VTAB=\v,RETURN=r}; Folosind typedef putem defini tipuri enumerative: typedef enum {ROSU, GALBEN, ALBASTRU} culori; typedef enum { lu, ma, mi, jo, vi, si, du } zile; 2.7. Tipul vid (void). Tipul void precizeaz o mulime vid de valori. Acesta se folosete pentru a specifica tipul unei funcii care nu ntoarce nici un rezultat, sau a unui pointer generic. 3. Tipuri derivate. Pe baza tipurilor fundamentale se pot construi tipuri derivate ca: tablouri de obiecte de un anumit tip functii care ntorc obiecte de un anumit tip pointeri la obiecte de un anumit tip structuri care conin obiecte de tipuri diferite uniuni care conin obiecte de tipuri diferite

4. Declararea variabilelor. O variabil const din dou componente: obiectul i numele obiectului. Numele pot fi identificatori sau expresii. Definirea sau declararea unei variabile are forma: clas-memorie tip declaratori; Clasa de memorie sau tipul pot fi omise. Declaratorii sunt identificatori. Fiecare declarator poate fi urmat de un iniializator, care specific valoarea iniial asociat identificatorului declarator. Asupra claselor de memorie vom reveni mai trziu, aa c n exemplele curente le vom omite: int i, j=0. char c; float x=1.5, y; enum CULORI s1, s2=ROSU; enum BOOLEAN p=TRUE; culori c1, c2; zile z, d; 5. Echivalena tipurilor.

Dou tipuri se consider echivalente n urmtoarele situaii: echivalen structural a tipurilor echivalena numelui tipului Dou obiecte sunt de tipuri structural echivalente, dac au acelai tip de componente. Dou obiecte sunt de tipuri echivalente dup nume, dac au fost definite folosind acelai nume de

tip. Exemple:

typedef int integer; int x, y; /* x i y sunt echivalente dupa numele tipului*/ integer z;/* x i z sunt de tipuri structural echivalente */

14

II. Operatori i expresii.


Un operator este un simbol care arat ce operaii se execut asupra unor operanzi (termeni). Un operand este o constant, o variabil, un nume de funcie sau o subexpresie a crei valoare este prelucrat direct de operator sau suport n prealabil o conversie de tip. Operatorii, dup numrul de operanzi asupra crora se aplic pot fi: unari, binari i ternari. n C exist 45 de operatori diferii dispui pe 15 niveluri de prioritate. n funcie de tipul operanzilor asupra crora se aplic, operatorii pot fi: aritmetici, relaionali, binari, logici, etc. Operatorii sunt mprii n clase de preceden (sau de prioritate). n fiecare clas de preceden este stabilit o regul de asociativitate, care indic ordinea de aplicare a operatorilor din clasa respectiv: de la stnga la dreapta sau de la dreapta la stnga. O expresie este o combinaie de operanzi, separai ntre ei prin operatori; prin evaluarea unei expresii se obine o valoare rezultat.Tipul valorii rezultat depinde de tipul operanzilor i a operatorilor folosii. Evaluarea unei expresii poate avea efecte laterale, manifestate prin modificarea valorii unor variabile. 1. Conversii de tip. Valorile pot fi convertite de la un tip la altul. Conversia poate fi implicit sau realizat n mod explicit de ctre programator. 1.1. Conversii implicite de tip. Conversiile implicite au loc atunci cnd este necesar ca operatorii i argumentele funciilor s corespund cu valorile ateptate pentru acestea. Acestea pot fi sintetizate prin tabelul: Tip char int Tip la care se convertete implicit int, short int, long int char (cu trunchiere) short int (cu trunchiere) long int (cu extensia semnului) ca i int ca i int double int, short int, long int float int, short int, long int

short int long int float double

1.2. Conversii aritmetice. Cnd un operator binar se aplic ntre doi operanzi de tip diferit, are loc o conversie implicit a tipului unuia dintre ei, i anume, operandul de tip mai restrns este convertit la tipul mai larg al celuilalt operand. Astfel n expresia f + i, operandul int este convertit n float. Operatorii aritmetici convertesc automat operanzii la un anumit tip, dac operanzii sunt de tip diferit. Se aplic urmtoarele reguli: operanzii char i short int se convertesc n int; operanzii float se convertesc n double. dac unul din operanzi este double restul operanzilor se convertesc n double iar rezultatul este tot double. dac unul din operanzi este long restul operanzilor se convertesc n long , iar rezultatul este tot long. dac unul din operanzi este unsigned restul operanzilor se convertesc n unsigned , iar rezultatul este tot unsigned.

15

dac nu se aplic ultimele 3 reguli, atunci operanzii vor fi de tip int i rezultatul de asemeni de tip int. double float long unsigned int char, short Astfel n = c - 0 n care c reprezint un caracter cifr calculeaz valoarea ntreag a acestui caracter. Conversii implicite se produc i n cazul operaiei de atribuire, n sensul c valoarea din partea dreapt este convertit la tipul variabilei acceptoare din stnga. Astfel pentru declaraiile: int i; float f; double d; char c; sunt permise atribuirile: i=f; fractionare */ f=i; d=f; f=d; c=i; i=c; /* cu trunchierea partii

1.3. Conversiile de tip explicite (cast). Conversiile explicite de tip (numite i cast) pot fi forate n orice expresie folosind un operator unar (cast) ntr-o construcie de forma: (tip) expresie n care expresia este convertit la tipul numit. Operatorul cast are aceeai preceden cu a unui operator unar. Astfel funcia sqrt() din biblioteca <math.h> cere un argument double, deci va fi apelat cu un cast: sqrt((double) n). Apelurile cu argumente de alt tip vor fi convertite n mod automat la tipul double: x=sqrt(2) va converti constanta 2 n 2.0. 2. Operatorii aritmetici. Operatorii aritmetici binari sunt: +, -, *, / i % (modul = restul impririi ntregi). Prioritatea operatorilor aritmetici este: +, unari *, /, % binari +, binari Regula de asociativitate este de la stnga la dreapta (la prioriti egale operatorii sunt evaluai de la stnga la dreapta). Operatori multiplicativi operator descriere tip operanzi tip rezultat preceden

16

* / %

nmulire mprire restul mpririi ntregi

aritmetic aritmetic ntreg

int,unsigned,long ,double int,unsigned,long ,double int,unsigned,long

3 3 3

Operatori aditivi operator descriere adunare + scdere

tip operanzi aritmetici pointer i ntreg aritmetici pointer i ntreg doi pointeri

tip rezultat int,unsigned,long,double pointer int,unsigned,long,double pointer int

preceden 4 4

3. Operatorii de atribuire. Operaia de atribuire modific valoarea asociat unei variabile (partea stng) la valoarea unei expresii (partea dreapt). Valoarea transmis din partea dreapt este convertit implicit la tipul prii stngi. Atribuiri de forma: a = a op b se scriu mai compact a op= b n care op= poart numele de operator de atribuire, op putnd fi un operator aritmetic (+, -,*,/,%) sau binar (>>, <<, &, ^, |). O atribuire multipl are forma: v1=v2=...=vn=expresie i este asociativ la dreapta. O operaie de atribuire terminat prin punct-virgul (terminatorul de instruciune) se transform ntr-o instruciune de atribuire. 4. Operatorii relaionali. Operatorii relaionali sunt: >, >=, <, <= , care au toi aceeai prioritate (preceden). Cu prioritate mai mic sunt: ==, !=. Operatorii relaionali au prioritate mai mic dect operatorii aritmetici. Putem deci scrie a < b -1 n loc de a < (b -1) Exemple: car >= a && car <= z Operatori relaionali operator < > <= >= == != descriere mai mic mai mare mai mic sau egal mai mare sau egal egal neegal tip operanzi aritmetic sau pointer aritmetic sau pointer aritmetic sau pointer aritmetic sau pointer aritmetic sau pointer aritmetic sau pointer tip rezultat int int int int int int preceden 6 6 6 6 7 7

5. Operatorii booleeni. Exist urmtorii operatori logici: ! - NEGATIE (operator unar) && - I logic (operatori binari) || - SAU logic Exemple: i<n-1 && (c=getchar()) != \n && c != EOF nu necesit paranteze suplimentare deoarece operatorii logici sunt mai puin prioritari dect cei relaionali.

17

bisect= an % 4 == 0 && an % 100 != 0 || an % 400 == 0; estecifra= c >= 0 && c <= 9 Condiia x == 0 este echivalent cu !x x != 0 && y != 0 && z != 0 este echivalent cu x && y && z Operatori booleeni operator ! && || descriere negaie I logic SAU logic Tip operanzi aritmetic sau pointer aritmetic sau pointer aritmetic sau pointer Tip rezultat int int int preceden 2 11 12 asociativitate DS SD SD

6. Operatorii binari (la nivel de bii). n C exist 6 operaii de manipulare a biilor aplicate asupra unor operanzi ntregi (char, short, int, long) cu sau fr semn: & - I | - SAU inclusiv ^ - SAU exclusiv << - deplasare stnga >> - deplasare dreapta ~ - complement fat de 1 (inversare) Operatorul I se foloseste pentru operaia de mascare a unor bii. n=n & 0177; /* pune pe 0 bitii din pozitia 8 in sus */ Operatorul SAU pune pe 1 biii specificai printr-o masc: x=x | MASCA; /* pune pe 1 bitii care sunt 1 in MASCA */ Deplasarea dreapta a unui ntreg cu semn este aritmetic, iar a unui ntreg fr semn este logic. De exemplu: x |= 1 << 7; /* pune pe 1 bitul 0 din octetul x */ x &= ~(1 << 7); /* pune pe 0 bitul 0 din octetul x */ Operatori pe bii operator << >> & ^ | descriere deplasare stnga deplasare dreapta I pe bii SAU exclusiv pe bii SAU inclusiv pe bii Tip operand ntreg ntreg ntreg ntreg ntreg tip rezultat ca operandul stng ca operandul stng int,long,unsigned int,long,unsigned int,long,unsigned preceden 5 5 8 9 10

7. Operatorul condiional. Decizia if (a > b) max = a; else max = b; poate fi reprezentat prin expresia condiional: max = a > b ? a : b n general ex1 ? ex2 : ex3 determin evaluarea ex1; dac aceasta nu este 0 atunci valoarea expresiei condiionale devine ex2, altfel ex3. 8. Operatorul secven.

18

Este reprezentat prin , i se foloseste n situaiile n care sintaxa impune prezena unei singure expresii, dar prelucrarea presupune prezena i evaluarea mai multor expresii. Exemplu: a < b ? (t=a, a=b, b=t) : a 9. Operatori unari a) Operatorul sizeof. Aplicat asupra unei variabile furnizeaz numrul de octei necesari stocrii variabilei respective. Poate fi aplicat i asupra unui tip sau asupra tipului unei expresii: sizeof variabila sizeof tip sizeof expresie sizeof este un operator cu efect la compilare. operator descriere Tip operand tip rezultat sizeof necesar de memorie variabil sau tip unsigned b) Operatorii de incrementare /decrementare. operator ++ ++ --descriere preincrementare postincrementare predecrementare postdecrementare tip operand aritmetic sau pointer aritmetic sau pointer aritmetic sau pointer aritmetic sau pointer tip rezultat int,long,double, unsigned,pointer la fel la fel la fel preceden 2 2 2 2 preceden 2

c) Operatori de adresare indirect / determinare adres & entitate - obine adresa unei entiti, * pointer - pentru adresare indirect - adic memoreaz adresa unei entiti printr-o valoare a unui pointer operator * & ~ ! descriere indirectare adresare negaie negaie logic tip operand Pointer la T T aritmetic aritmetic sau pointer tip rezultat T pointer la T int,long,double int preceden 2 2 2 2

d) Operatori de acces : - la elementele unui tablou - la cmpurile unei structuri sau unei uniuni - indirect prin intermediul unui pointer la cmpurile unei structuri sau unei uniuni Operatorii de acces sunt: [] indexare folosit n expresii de forma tablou[indice] . selecie direct - pentru adresarea unui cmp dintr-o structur sau uniune sub forma: struct.selector selecie indirect - pentru accesul la un cmp dintr-o structur sau uniune, a crei adres este memorat ntr-un pointer pointer -> selector este echivalent cu (* pointer) . selector Toi aceti operatori de acces, mpreun cu operatorul de apel de funcie () au cea mai ridicat prioritate, i anume 1. Operatori de acces operator descriere () apel de funcie [] indexare tablou . selector structur exemple Sqrt(x),printf(salut\n) x[i], a[i][j] student.nastere.an preceden 1 1 1

19

->

selector indirect structur

pstud->nume

Ordinea evaluarii operanzilor. preceden 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Operatori apel funcie / selecie Unari Multiplicativi Aditivi Deplasri Relaionali egalitate / neegalitate I pe bii SAU exclusiv pe bii SAU inclusiv pe bii I logic SAU logic Condiional Atribuire Virgula simbol () [] . -> * & - ! ~ ++ -* / % + << >> < > <= >= == != & ^ | && || ?: = op= , asociativitate SD DS SD SD SD SD SD SD SD SD SD SD DS DS SD

sizeof

20

You might also like