tipuri,variabile,operatori si expresii in c si c++

Upload: inaqx

Post on 16-Oct-2015

36 views

Category:

Documents


0 download

DESCRIPTION

Tipuri,variabile,operatori si expresii in C si C++

TRANSCRIPT

Tipuri,variabile,operatori si expresii in C si C++

I. Tipuri i variabile1. 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.

Declararea unui obiect specific numai proprietile obiectului, fr a aloca memorie pentru acesta.

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

Caracterele netipribile se reprezint prin mai multe caractere speciale numite secvene escape. Acestea sunt:

\nsfrit de linie (LF)

\ttabulare orizontal (HT)

\vtabulare vertical (VT)

\brevenire la caracterul precedent (BS)\rrevenire la nceput de linie (CR)\favans la pagin nou (FF)\aalarm (BEL)

\\caracterul \\?caracterul ?\caracterul \caracterul \ooocaracterul cu codul octal ooo\xhhcaracterul cu codul hexazecimal hh2.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: 257, -65, +4928

8: 0125, 0177

16: 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.

- 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: 125014730x2AFC+645

-8359Literalii 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 .fractieExemple: 2.25, 1., -.5, +234.5

Constantele reale pot fi exprimate cu mantis i exponent (notaia tiinific):

mantisaEexponent = mantisa 10exponentExemple: 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:

[][.][ E]

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-32.5. Definiri de tip cu typedef.

Un tip de date poate avea i un alt nume, prin folosirea declaraiei typedef. De exemplu:

typedef int intreg

Acelai efect se obine cu directiva define:

#define intreg int

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};

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

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:

TipTip la care se convertete implicit

charint, short int, long int

intchar (cu trunchiere)

short int (cu trunchiere)

long int (cu extensia semnului)

short intca i int

long intca i int

floatdouble

int, short int, long int

doublefloat

int, short int, long int

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.

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; /* cu trunchierea partii fractionare */

f=i;

d=f;

f=d;

c=i;

i=c;

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

operatordescrieretip operanzitip rezultatpreceden

*nmulirearitmeticint,unsigned,long,double3

/mprirearitmeticint,unsigned,long,double3

%restul mpririi ntregintregint,unsigned,long3

Operatori aditivi

operatordescrieretip operanzitip rezultatpreceden

+adunarearitmetici

pointer i ntregint,unsigned,long,double

pointer4

-scderearitmetici

pointer i ntreg

doi pointeriint,unsigned,long,double

pointer

int4

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 (>>, =, selector indirect structurpstud->nume1

Ordinea evaluarii operanzilor.

precedenOperatorisimbolasociativitate

1apel funcie / selecie() [] . -> SD

2Unari* & - ! ~ ++ -- sizeofDS

3Multiplicativi* / %SD

4Aditivi + - SD

5Deplasri>SD

6Relaionali< > =SD

7egalitate / neegalitate== !=SD

8I pe bii&SD

9SAU exclusiv pe bii^SD

10SAU inclusiv pe bii|SD

11I logic&&SD

12SAU logic||SD

13Condiional?:DS

14Atribuire= op=DS

15Virgula,SD

PAGE 21