You are on page 1of 22

CAPITOLUL 2

Date, operatori i expresii

DATE, OPERATORI I EXPRESII


2.1. Limbajele C i C++ 2.2. Programe n limbajul C/C++ 2.3. Preprocesorul 2.4. Elemente de baz ale limbajului 2.4.1. Vocabularul 2.4.2. Unitile lexicale 2.5. Date n limbajul C/C++ 2.5.1. Tipuri de date 2.5.2. Constante 2.5.3. Variabile 2.6. Operatori i expresii 2.6.1. Operatori 2.6.2. Expresii 2.7. Conversii de tip

2.1. LIMBAJELE C I C++


Aa cum comunicarea dintre dou persoane se realizeaz prin intermediul limbajului natural, comunicarea dintre om i calculator este mijlocit de un limbaj de programare. Limbajele C i C++ sunt limbaje de programare de nivel nalt. Limbajul C a aprut n anii 1970 i a fost creat de Dennis Ritchie n laboratoarele AT&T Bell. Limbajul C face parte din familia de limbaje concepute pe principiile programrii structurate, la care ideea central este structureaz pentru a stpni o aplicaie. Popularitatea limbajului a crescut rapid datorit eleganei i a multiplelor posibiliti oferite programatorului (puterea i flexibilitatea unui limbaj de asamblare); ca urmare, au aprut numeroase alte implementri. De aceea, n anii 80 se impune necesitatea standardizrii acestui limbaj. n perioada 1983-1990, un comitet desemnat de ANSI (American National Standards Institute) a elaborat un compilator ANSI C, care permite scrierea unor programe care pot fi portate fr modificri, pe orice sistem. Limbajul C++ apare la nceputul anilor 80 i l are ca autor pe Bjarne Stroustrup. El este o variant de limbaj C mbuntit, mai riguroas i mai puternic, completat cu construciile necesare aplicrii principiilor programrii orientate pe obiecte (POO). Limbajul C++ pstreaz toate elementele limbajului C, beneficiind de eficiena i flexibilitatea acestuia. Limbajul C++ este un superset al limbajului C. Incompatibilitile sunt minore, de aceea, modulele C pot fi ncorporate n proiecte C++ cu un efort minim.

2.2.

PROGRAME N LIMBAJUL C/C++

Un program scris n limbajul C (sau C++) este compus din unul sau mai multe fiiere surs. Un fiier surs este un fiier text care conine codul surs (n limbajul C) al unui program. Fiecare fiier surs conine una sau mai multe funcii i eventual, referine ctre unul sau mai multe fiiere header (figura 2.1.). Funcia principal a unui program este numit main. Execuia programului ncepe cu execuia acestei funcii, care poate apela, la rndul ei, alte funcii. Toate funciile folosite n program trebuie descrise n fiierele surs (cele scrise de ctre programator), n fiiere header (funciile predefinite, existente n limbaj), sau n biblioteci de funcii. Un fiier header este un fiier aflat n sistem sau creat de ctre programator, care conine declaraii i definiii de funcii i variabile. Aciunile din fiecare funcie sunt codificate prin instruciuni (figura 2.2.a.). Exist mai multe tipuri de instruciuni, care vor fi discutate n capitolul urmtor. O instruciune este orice expresie valid (de obicei, o asignare sau un apel de funcie), urmat de simbolul ;. n figura 2.2.b. este dat un exemplu de instruciune

19

CAPITOLUL 2

Date, operatori i expresii

simpl. Uneori, ca instruciune poate apare instruciunea nul (doar ;), sau instruciunea compus (privit ca o succesiune de instruciuni simple, ncadrate ntre acoladele delimitatoare {}. Program Fiier surs Fiier surs Fiiere header

Funcii

main

Biblioteci C++

Funcii din bibliotec Figura 2.1. Structura unui program n limbajul C O expresie este o structur corect sintactic, format din operanzi i operatori (figura 2.2.c.). FUNCII Instruciunea1 Instruciunea2 Instruciunea3
. . . .

INSTRUCIUNI Expresie;

EXPRESII Operanzi

Operatori 2.2.b. 2.2.c.

2.2.a.

Figura 2.2. Funcie, instruciune, expresie


Pentru a nelege mai bine noiunile prezentate, s considerm un exemplu foarte simplu. Programul urmtor afieaz pe ecran un mesaj (mesajul Primul meu program). Informaia de prelucrat (de intrare) este nsui mesajul (o constant ir), iar prelucrarea ei const n afiarea pe ecran. Exemplu: #include <iostream.h> // linia 1 void main() // linia 2 - antetul funciei main { /* linia 3 - nceputul corpului funciei, a unei intruciuni compuse */ cout<<Primul meu program in limbajul C++\n; // linia 5 } // linia6-sfritul corpului funciei Prima linie este o directiv preprocesor (indicat de simbolul #) care determin includerea n fiierul surs a fiierului header cu numele iostream.h. Acest header permite realizarea afirii pe monitor. Programul conine o singur funcie, funcia principal, numit main, al crui antet (linia 2) indic: - tipul valorii returnate de funcie (void, ceea ce nseamn c funcia nu returneaz nici o valoare) - numele funciei (main)
20

CAPITOLUL 2

Date, operatori i expresii

- lista argumentelor primite de funcie, ncadrat de cele 2 paranteze rotunde. Funciile comunic ntre ele prin argumente. Aceste argumente reprezint datele de intrare ale funciei. n cazul nostru, nu avem nici un argument n acea list, deci puteam s scriem antetul funciei i astfel:
void main(void)

Ceea ce urmeaz dup simbolul //, pn la sfritul liniei, este un comentariu, care va fi ignorat de ctre compilator. Comentariul poate conine un text explicativ; informaii lmuritoare la anumite aspecte ale problemei sau observaii. Dac vrem s folosim un comentariu care cuprinde mai multe linii, vom delimita nceputul acestuia indicat prin simbolulurile /*, iar sfritul - prin */ (vezi liniile 3, 4). Introducerea comentariilor n programele surs uureaz nelegerea acestora. n general, se recomand introducerea unor comentarii dup antetul unei funciei, pentru a preciza prelucrrile efectuate n funcie, anumite limite impuse datelor de intrare, etc. nceputul i sfritul corpului funciei main sunt indicate de cele dou acoalade { (linia3) i }(linia 6). Corpul funciei (linia 5) este format dintr-o singur instruciune, care implementeaz o operaie de scriere. Cuvantul cout este un cuvnt predefinit al limbajului C++ - console output - care desemneaz dispozitivul logic de iesire; simbolul << este operatorul de transfer a informaiei. Folosite astfel, se deschide un canal de comunicaie a datelor ctre dispozitivul de ieire, n cazul acesta, monitorul. Dup operator se specific informaiile care vor fi afiate (n acest exemplu, un ir de caractere constant). Faptul c este un ir constant de caractere este indicat de ghilimelele care l ncadreaz. Pe ecran va fi afiat fiecare caracter din acest ir, cu excepia grupului \n. Dei grupul este format din dou caractere, acesta va fi interpretat ca un singur caracter - numit caracter escape - care determin poziionarea cursorului la nceputul urmtoarei linii. O secven escape (cum este \n) furnizeaz un mecanism general i extensibil pentru reprezentarea caracterelor invizibile sau greu de obinut. La sfritul instruciunii care implementeaz operaia de scriere, apare ; .

2.3. PREPROCESORUL
Aa cum am menionat n capitolul 1.3., n faza de compilare a fiierului surs este invocat nti preprocesorul. Acesta trateaz directivele speciale - numite directive preprocesor - pe care le gsete n fiierul surs. Directivele preprocesor sunt identificate prin simbolul #, care trebuie s fie primul caracter, diferit de spaiu, dintr-o linie. Directivele preprocesor sunt utilizate la includerea fiierelor header, la definirea numelor constantelor simbolice, la definirea macro-urilor, sau la realizarea altor funcii (de exemplu, compilarea condiionat), aa cum ilustreaz exemplele urmtoare:

Includerea fiierelor header n codul surs: Exemplul1:


#include <stdio.h>

Cnd procesorul ntlnete aceast linie, datorit simbolului #, o recunoate ca fiind o directiv preprocesor, localizeaz fiierul header indicat (parantezele unghiulare < > indic faptul c este vorba de un fiier header sistem). Exemplul 2:
#include "headerul_meu.h"

Numele fiierului header inclus ntre ghilimele, indic faptul c headerul_meu.h este un fiier header creat de utilizator. Preprocesorul va cuta s localizeze acest fiier n directorul curent de lucru al utilizatorului. n cazul n care fiierul header nu se afl n directorul curent, se va indica i calea ctre acesta. Exemplul 3:
#include "c:\\bc\\head\\headerul_meu.h"

n acest exemplu, pentru interpretarea corect a caracterului backslash \, a fost necesar "dublarea" acestuia, din motive pe care le vom prezenta n paragraful 2.5.2.4.

Asignarea de nume simbolice constantelor: Exemplu:


#define TRUE #define FALSE 1 0

21

CAPITOLUL 2

Date, operatori i expresii

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii ntregi 1 numelui (constantei simbolice) TRUE, i a valorii 0 numelui simbolic FALSE. Ca urmare, naintea compilrii propriu-zise, n programul surs, apariiile numelor TRUE i FALSE vor fi nlocuite cu valorile 1, respectiv 0.

Macrodefiniii: Directiva #define este folosit i n macrodefiniii. Macrodefiniiile permit folosirea unor nume simbolice pentru expresiile indicate n directiv. Exemplu:
#define NEGATIV(x) -(x)

ntre numele macrodefiniiei i paranteza stng ( NEGATIV() ) nu sunt permise spaii albe. La ntalnirea n programul surs a macrodefiniiei NEGATIV, preprocesorul subtituie argumentul acesteia cu expresia (negativarea argumentului). Macrodefiniia din exemplu poate fi folosit n programul surs astfel: NEGATIV(a+b). Cnd preprocesorul ntlnete numele expresiei, subtituie literalii din parantez, a+b, cu argumentul din macrodefiniie, x, obinndu-se -(a+b). Dac macrodefiniia ar fi fost de forma:
#define NEGATIV(x) NEGATIV(a+b) ar fi fost tratat ca -a+b. -x

2.4. ELEMENTE DE BAZ ALE LIMBAJULUI 2.4.1. VOCABULARUL


n scrierea programelor n limbajul C/C++ pot fi folosite doar anumite simboluri care alctuiesc alfabetul limbajului. Acesta cuprinde: Literele mari sau mici de la A la Z (a-z); Caracterul subliniere ( _ underscore), folosit, de obicei, ca element de legtura ntre cuvintele compuse; Cifrele zecimale (0-9); Simboluri speciale: Caractere: operatori (Exemple: +, *, !=); delimitatori (Exemple: blank (spaiu), tab \t, newline \n, cu rolul de a separa cuvintele); Grupuri (perechi de caractere). Grupurile de caractere, numire adesea separatori, pot fi: ( ) - ncadreaz lista de argumente ale unei funcii sau sunt folosite n expresii pentru schimbarea ordinii de efectuare a operaiilor (n ultimul caz, fiind operator); { } - ncadreaz instruciunile compuse; // - Indic nceputul unui comentariu care se poate ntinde pn la sfritul liniei; /* */ - Indic nceputul i sfritul unui comentariu care poate cuprinde mai multe linii; " " - ncadreaz o constant ir (un ir de caractere); ' ' - ncadreaz o constant caracter (un caracter imprimabil sau o secven escape).

2.4.2. UNITILE LEXICALE


Unitile lexicale (cuvintele) limbajului C/C++ reprezint grupuri de caractere cu o semnificaie de sine stttoare. Acestea sunt: Identificatori; Cuvinte cheie ale limbajului; Identificatorii reprezint numele unor date (constante sau variabile), sau ale unor funcii. Identificatorul este format dintr-un ir de litere, cifre sau caracterul de subliniere (underscore), trebuie s nceap cu o liter sau cu caracterul de subliniere i s fie sugestivi.
22

CAPITOLUL 2

Date, operatori i expresii

Exemple: vitez, greutate_net, Viteza, Viteza1, GreutateNet Identificatorii pot conine litere mici sau mari, dar limbajul C++ este senzitiv la majuscule i minuscule (case-sensitive). Astfel, identificatorii viteza i Viteza sunt diferii. Nu pot fi folosii ca identificatori cuvintele cheie. Identificatorii pot fi standard (ca de exemplu numele unor funcii predefinite: scanf, clear, etc.) sau alei de utilizator. Cuvintele cheie sunt cuvinte ale limbajului, mprumutate din limba englez, crora programatorul nu le poate da o alt utilizare. Cuvintele cheie se scriu cu litere mici i pot reprezenta: Tipuri de date (Exemple: int, char, double); Clase de memorare (Exemple: extern, static, register); Instruciuni (Exemple: if, for, while); Operatori (Exemplu: sizeof). Sensul cuvintelor cheie va fi explicat pe masur ce vor fi prezentate construciile n care acestea apar.

2.5. DATE N LIMBAJUL C/C++


Aa cum s-a vzut n capitolul 1, un program realizeaz o prelucrare de informaie. Termenul de prelucrare trebuie s fie considerat ntr-un sens foarte general (de exemplu, n programul prezentat n paragraful 2.2., prelucrarea se referea la un text i consta n afiarea lui). n program datele apar fie sub forma unor constante (valori cunoscute anticipat, care nu se modific), fie sub forma de variabile. Constantele i variabilele sunt obiectele informaionale de baz manipulate ntr-un program. Fiecare categorie de date este caracterizat de atributele: Nume; Valoare; Tip; Clasa de memorare. De primele trei tipuri de atribute ne vom ocupa n continuare, urmnd ca de atributul clas de memorare s ne ocupm n paragraful 6.8. Numele unei date Numele unei date este un identificator i, ca urmare, trebuie s respecte regulile specifice identificatorilor. Deasemenea, numrul de caractere care intr n compunerea unui identificator este nelimitat, ns, implicit, numai primele 32 de caractere sunt luate n considerare. Aceasta nseamn c doi identificatori care au primele 32 de caractere identice, difereniindu-se prin caracterul 33, vor fi considerai identici.

2.5.1. TIPURI DE DATE


Tipul unei date const ntr-o mulime de valori pentru care s-a adoptat un anumit mod de reprezentare n memoria calculatorului i o mulime de operatori care pot fi aplicai acestor valori. Tipul unei date determin lungimea zonei de memorie ocupat de acea dat. n general, lungimea zonei de memorare este dependent de calculatorul pe care s-a implementat compilatorul. Tabelul 2.1. prezint lungimea zonei de memorie ocupat de fiecare tip de dat pentru compilatoarele sub MS-DOS i UNIX/LINUX. Tipurile de baz sunt: char un singur octet (1 byte=8 bii), capabil s conin codul unui caracter din setul local de caractere; int numr ntreg, reflect n mod tipic mrimea natural din calculatorul utilizat; float numr real, n virgul mobil, simpl precizie; double numr real, n virgul mobil, dubl precizie. n completare exist un numr de calificatori, care se pot aplica tipurilor de baz char, int, float sau double: short, long, signed i unsigned. Astfel, se obin tipurile derivate de date. Short i long se refer la mrimea diferit a ntregilor, iar datele de tip unsigned int sunt ntotdeauna pozitive. S-a
23

CAPITOLUL 2

Date, operatori i expresii

intenionat ca short i long s furnizeze diferite lungimi de ntregi, int reflectnd mrimea cea mai "natural" pentru un anumit calculator. Fiecare compilator este liber s interpreteze short i long n mod adecvat propriului hardware; n nici un caz, ns, short nu este mai lung dect long. Toi aceti calificatori pot aplicai tipului int. Calificatorii signed (cel implicit) i unsigned se aplic tipului char. Calificatorul long se aplic tipului double. Dac ntr-o declaraie se omite tipul de baz, implicit, acesta va fi int. Tabelul 2.1. Tip Lungimea zonei de memorie ocupate (n bii) MSUNIX DOS LINUX 8 8 8 8 16 32 32 16 16 32 32 64 80 8 8 32 64 64 32 32 64 32 64 128 Descriere

char unsigned char signed char int long (long int) long long int short int unsigned int unsigned long int float double long double

Valoarea unui singur caracter; poate fi ntlnit n expresii cu extensie de semn Aceeai ca la char, far extensie de semn Aceeai ca la char, cu extensie de semn obligatorie Valoare ntreag Valoare ntreag cu precizie mare Valoare ntreag cu precizie mare Valoare ntreag cu precizie mic Valoare ntreag, fr semn Valoare ntreag, fr semn Valoare numeric cu zecimale, simpl precizie (6 ) Valoare numeric cu zecimale, dubl precizie (10 ) Valoare numeric cu zecimale, dubl precizie

S considerm, de exmplu, tipul int, folosit pentru date ntregi (pozitive sau negative). Evident c mulimea valorilor pentru acest tip va fi, de fapt, o submulime finit de numere ntregi. Dac pentru memorarea unei 1 date de tip int se folosesc 2 octei de memorie, atunci valoarea maxim pentru aceasta va fi 2 16 - 1, 2 1 deci 2 15 - 1 (32767), iar valoarea minim va fi 2 16 , deci -2 15 (-32768). ncercarea de a calcula 2 o expresie de tip int a crei valoare se situeaz n afara acestui domeniu va conduce la o eroare de execuie. Mulimea valorilor pentru o dat de tip unsigned int (ntreg fr semn) va fi format din numerele ntregi situate n intervalul [0, 2 16 - 1]. n header-ul <values.h> sunt definite constantele simbolice (cum ar fi: MAXINT, MAXSHORT, MAXLONG, MINDOUBLE, MINFLOAT, etc.) care au ca valoare limitele inferioar i superioar ale intervalului de valori pentru tipurile de date enumerate. (de exemplu MAXINT reprezint valoarea ntregului maxim care se poate memora, etc. ) Fr a detalia foarte mult modul de reprezentare a datelor reale (de tip float sau double), vom sublinia faptul c, pentru acestea, este important i precizia de reprezentare. Deoarece calculatorul poate reprezenta doar o submulime finit de valori reale, n anumite cazuri, pot apare erori importante. Numerele reale pot fi scrise sub forma: N = mantisa baza exponent unde:baza reprezint baza sistemului de numeraie; mantisa (coeficientul) este un numr fracionar normalizat ( n faa virgulei se afl 0, iar prima cifr de dup virgul este diferit de zero); exponentul este un numr ntreg. Deoarece forma intern de reprezentare este binar, baza=2. n memorie vor fi reprezentate doar mantisa i exponentul. Numrul de cifre de dup virgul determin precizia de exprimare a numrului. Ce alte cuvinte, pe un calculator cu o precizie de 6 cifre semnificative, dou valori reale care difer la a 7-a cifr zecimal, vor avea aceeai reprezentare. Pentru datele de tip float, precizia de reprezentare este 6; pentru cele de tip double, precizia este 14, iar pentru cele de tip long double, precizia este 20.
24

CAPITOLUL 2

Date, operatori i expresii

Lungimea zonei de memorie ocupate de o dat de un anumit tip (pe ci octei este memorat data) poate fi aflat cu ajutorul operatorului sizeof. Exemplu:
cout<<"Un int este memorat pe "<<sizeof(int)<<"octeti.\n";

Instruciunea are ca efect afiarea pe monitor a mesajului: Un int este memorat pe 2 octei.

2.5.2. CONSTANTE
O constant este un literal (o form extern de reprezentare) numeric, caracter sau ir de caractere. Numele i valoarea unei constante sunt identice. Valoarea unei constante nu poate fi schimbat n timpul execuiei programului n care a fost utilizat. Tipul i valoarea ei sunt determinate n mod automat, de ctre compilator, pe baza caracterelor care compun literalul.

2.5.2.1. Constante ntregi


Constantele ntregi sunt literali numerici (compui din cifre), fr punct zecimal. Constante ntregi n baza 10, 8 sau 16 Constante ntregi n baza 10 Exemple: // constante ntregi decimale (n baza 10), tip int Constante ntregi octale Dac n faa numrului apare cifra zero (0), acest lucru indic faptul c acea constant este de tipul int, in baza opt (constant octal). Exemple: // constante ntregi octale, tip int Constante ntregi hexagesimale Dac n faa numrului apar caracterele zero (0) i x (sau X), acest lucru indic faptul c acea constant este de tipul int, n baza 16 (constant hexagesimal). Amintim c n baza 16 cifrele sunt: 0-9, A (sau a) cu valoare 10, B (sau b) cu valoare 11, C (sau c) cu valoare 12, D (sau d) cu valoare 13, E (sau e) cu valoare 14, F (sau f) cu valoare 15. Exemple:
0x45 0x3A 0Xbc 056 077 45 -78

// constante ntregi hexagesimale, tip int Constante ntregi, de tipuri derivate Dac secvena de cifre este urmat de L sau l, tipul constantei este long int. Exemple: // tip decimal long int Dac secvena de cifre este urmat de U sau u, tipul constantei este unsigned int. Exemple:
65555u

145677L 897655l

Dac secvena de cifre este urmat de U (u) i L (l), tipul constantei este unsigned long int. Exemple: 7899UL //tip decimal unsigned long int

2.5.2.2. Constante numerice, reale

Dac o constant numeric conine punctul zecimal, ea este de tipul double. Exemplu: 3.1459 //tip double Dac numrul este urmat de F sau f, constante este de tip float. Dac numrul este urmat de L sau l, este de tip long double.
25

CAPITOLUL 2

Date, operatori i expresii 0.45f 9.788L

Exemplu: //tip float //tip long double Constante reale n format tiinific Numrul poate fi urmat de caracterul e sau E i de un numr ntreg, cu sau fr semn. n acest caz, constanta este n notaie tiinific. n aceast form extern de reprezentare, numrul din faa literei E reprezint mantisa, iar numrul ntreg care urmeaz caracterului E reprezint exponentul. In forma extern de reprezentare, baza de numeraie este 10, deci valoarea constantei va fi dat de mantisa 10 exp onent . Exemplu: 1.5e-2 //tip double, n notaie tiinific, valoare 1.5 10 2
#include <iostream.h> #include <values.h> #define PI 3.14359 int main() { cout<<"Tipul int memorat pe: "<<sizeof(int)<<" octeti\n"; cout<<"Tipul int memorat pe: "<<sizeof(23)<<" octeti\n"; //23-const. zecimala int cout<<"Int maxim="<<MAXINT<<\n;

Exerciiu: S se scrie urmtorul program i s se urmreasc rezultatele execuiei acestuia.

//const. simbolice MAXINT, MAXLONG, etc. - definite in <values.h>


cout<<"Const. octala 077 are val decimala:"<<077<<\n; cout<<"Const. hexagesimala d3 are val decimala:"<<0xd3<<\n; cout<<"Tipul unsigned int memorat pe:"<<sizeof(unsigned int)<<" octeti\n"; cout<<"Tipul unsigned int memorat pe: "<<sizeof(23U)<<" octeti\n"; cout<<"Tipul unsigned int memorat pe: "<<sizeof(23u)<<" octeti\n"; cout<<"Tipul long int memorat pe: "<<sizeof(long int)<<" octeti\n"; cout<<"Tipul long int memorat pe: "<<sizeof(23L)<<" octeti\n"; cout<<"Tipul long int memorat pe: "<<sizeof(23l)<<" octeti\n";

//23L sau 23l-const. decimala long int


cout<<"Long int maxim="<<MAXLONG<<\n; cout<<"Tipul unsigned long memorat pe:"; cout<<sizeof(unsigned long int)<<" octeti\n"; cout<<"Tipul unsigned long memorat pe: "<<sizeof(23UL)<<" octeti\n"; cout<<"Tipul unsigned long memorat pe: "<<sizeof(23ul)<<" octeti\n";

//23UL sau 23ul-const. decimala unsigned long int


cout<<"Tipul long long int memorat pe: "; cout<<sizeof(long long int)<<" octeti\n"; cout<<"Tipul long long int memorat pe: "<<sizeof(d)<<" octeti\n"; cout<<"Tipul short int memorat pe: "<<sizeof(short int)<<" octeti\n"; cout<<"Short int maxim="<<MAXSHORT<<\n; cout<<"Tipul float memorat pe: "<<sizeof(float)<<" octeti\n"; cout<<"Tipul float memorat pe: "<<sizeof(23.7f)<<" octeti\n";

//23.7f-const. decimala float


cout<<"Float cout<<"Float cout<<"Tipul cout<<"Tipul maxim="<<MAXFLOAT<<\n; minim="<<MINFLOAT<<\n; double memorat pe: "<<sizeof(double)<<" octeti\n"; double memorat pe: "<<sizeof(23.7)<<" octeti\n";

//23.7-const. decimala double


cout<<"Const. decim. doubla in notatie stiintifica:"<<23.7e-5<<\n; cout<<Const. PI este:<<PI<<\n; cout<<Constanta PI este memorata pe:<<sizeof(PI)<<octeti\n: cout<<"Double maxim="<<MAXDOUBLE<<\n<<"Double minim="<<MINDOUBLE<<\n; cout<<"Tipul long double memorat pe: "<<sizeof(long double)<<" octeti\n"; cout<<"Tipul long double memorat pe: "<<sizeof(23.7L)<<" octeti\n";

//23.7L-const. decimala long double


cout<<"Cifra A din HEXA are val.:"<<0xA<<"\n"; cout<<"Cifra B din HEXA are val.:"<<0XB<<"\n";

26

CAPITOLUL 2 Date, operatori i expresii cout<<"Cifra C din HEXA are val.:"<<0xc<<"\n"; cout<<" Cifra D din HEXA are val.:"<<0xD<<"\n"; cout<<" Cifra E din HEXA are val.:"<<0XE<<"\n"; cout<<" Cifra F din HEXA are val.:"<<0xf<<"\n"; cout<<"Val. const. hexa 0x7ac1e este: "<<0x7ac1e<<'\n'; cout<<"Val. const. octale 171 este: "<<0171<<'\n'; cout<<"O const. octala se memoreaza pe "<<sizeof(011)<<" octeti\n"; cout<<"O const.oct.long se mem pe ";cout<<sizeof(011L)<<" octeti\n";}

2.5.2.3. Constante caracter Constantele caracter sunt ncadrate ntre apostroafe.


Exemplu:
'a' //tip char O constant caracter are ca valoare codul ASCII al caracterului pe care l reprezint. Acest set de caractere are urmtoarele proprieti: Fiecrui caracter i corespunde o valoare ntreag distinct (ordinal); Valorile ordinale ale literelor mari sunt ordonate i consecutive ('A' are codul ASCII 65, 'B' - codul 66, 'C' - codul 67, etc.); Valorile ordinale ale literelor mici sunt ordonate i consecutive ('a' are codul ASCII 97, 'b' - codul 98, 'c' - codul 99, etc.); Valorile ordinale ale cifrelor sunt ordonate i consecutive ('0' are codul ASCII 48, '1' - codul 49, '2' codul 50, etc.).

Constante caracter corespunztoare caracterelor imprimabile O constant caracter corespunztoare unui caracter imprimabil se reprezint prin caracterul respectiv inclus ntre apostroafe. Exemplu: Constant caracter Valoare
A a 0 * 65 97 48 42

Excepii de la regula de mai sus le constituie caracterele imprimabile apostrof (') i backslash (\). Caracterul backslash se reprezint: '\\'. Caracterul apostrof se reprezint: '\''.

Constante caracter corespunztoare caracterelor neimprimabile Pentru caracterele neimprimabile, se folosesc secvene escape. O secven escape furnizeaz un mecanism general i extensibil pentru reprezentarea caracterelor invizibile sau greu de obinut. n tabelul 2.2. sunt prezentate cteva caractere escape utilizate frecvent. Tabelul 2.2. Constant caracter
\n \t \r \f \a

Valoare (Cod ASCII)


10 9 13 12 7

Denumirea caracterului
LF HT CR FF BEL

Utilizare

rnd nou (Line Feed) tabulator orizontal poziioneaz cursorul n coloana 1 din rndul curent salt de pagin la imprimant (Form Feed) activare sunet O constant caracter pentru o secven escape poate apare ns, i sub o form n care se indic codul ASCII, n octal, al caracterului dorit: \ddd unde d este o cifr octal. Exemple: \11 (pentru \t) reprezint constanta caracter backspace, cu codul 9 n baza 10, deci codul 11 n baza 8.
27

CAPITOLUL 2 \15 (pentru \r)

Date, operatori i expresii

reprezint constanta caracter CR, cu codul 13 n baza 10, deci codul 11 n baza 8. Exerciiu: S se scrie urmtorul program i s se urmreasc rezultatele execuiei acestuia.
#include <iostream.h> void main(void) { cout<<"Un caracter este memorat pe "<<sizeof(char)<<" octet\n"; cout<<"Caracterul escape \\n este memorat pe "; cout<<sizeof('\n')<<" octet\n"; cout<<"Caracterul escape '\\n\' este memorat pe "<<sizeof('\n'); cout<<" octet\n"; cout<<"Caracterul '9' este memorat pe "<<sizeof('9')<<" octet\n"; cout<<'B';cout<<' ';cout<<'c';cout<<'\t'; cout<<'\t';cout<<'9';cout<<'\b';cout<<'\a'; cout<<'L';cout<<'\v';cout<<'L'; cout<<'\'';cout<<'\t';cout<<'\"';cout<<'\\';cout<<'\n'; cout<<'\a';cout<<'\7'; }

2.5.2.4. Constante ir de caractere


Constanta ir este o succesiune de zero sau mai multe caractere, ncadrate de ghilimele. n componena unui ir de caractere, poate intra orice caracter, deci i caracterele escape. Lungimea unui ir este practic nelimitat. Dac se dorete continuarea unui ir pe rndul urmtor, se folosete caracterul backslash. Caracterele componente ale unui ir sunt memorate ntr-o zon continu de memorie (la adrese succesive). Pentru fiecare caracter se memoreaz codul ASCII al acestuia. Dup ultimul caracter al irului, compilatorul plaseaz automat caracterul NULL (\0), caracter care reprezint marcatorul sfritului de ir. Numrul de octei pe care este memorat un ir va fi, deci, mai mare cu 1 dect numrul de caractere din ir. Exemple: Acesta este un ir de caractere //constant ir memorat pe 32 octei
ir de caractere continuat\ pe rndul urmtor! //constant ir memorat pe 45 octei ir \t cu secvene escape\n //constant ir memorat pe 26 octei \n //constant caracter memorat pe un octet \n //constanta ir memorat pe 2 octei (codul caracterului escape i terminatorul de ir) a\a4 /*ir memorat pe 4 octei:

\\ASCII\\

1\175a

Pe primul octet: codul ASCII al caracterului a Pe al doilea octet: codul ASCII al caracterului escape \a Pe al treilea octet: codul ASCII al caracterului 4 Pe al patrulea octet: terminatorul de ir NULL, cod ASCII 0 */ /*ir memorat pe 8 octei: Pe primul octet: codul ASCII al caracterului backslah Pe al doilea octet: codul ASCII al caracterului A Pe al treilea octet: codul ASCII al caracterului S Pe al patrulea octet: codul ASCII al caracterului S Pe al 6-lea octet: codul ASCII al caracterului I Pe al 7-lea octet: codul ASCII al caracterului I Pe al 8-lea octet: codul ASCII al caracterului backslah Pe al 9-ea octet: terminatorul de ir NULL, de cod ASCII 0 */ /*ir memorat pe 4 octei: Primul octet: Codul ASCII al caracterul 1 Al 2-lea octet: codul ASCII 125 (175 in octal) al caracterului } Al 3-lea octet: codul ASCII al caracterului a Al 4-lea octet: codul ASCII 0 pentru terminatorul irului */
28

CAPITOLUL 2

Date, operatori i expresii

Exerciiu: S se scrie urmtorul program i s se urmreasc rezultatele execuiei acestuia.


#include <iostream.h> void main() { cout<<"irul \"Ab9d\" este memorat pe:"<<sizeof("Ab9d")<<" octei\n"; cout<<"irul \"Abcd\\t\" este memorat pe:"<<sizeof("Abcd\t")<<" octei\n"; cout<<"irul \"\n\" este memorat pe "<<sizeof("\n")<<" octei\n"; cout<<"irul \"\\n\" este memorat pe "<<sizeof("\n")<<" octei\n"; cout<<"irul \"ABCDE\" se memoreaz pe "<<sizeof("ABCDE")<<" octei\n";}

2.5.3. VARIABILE
Spre deosebire de constante, variabilele sunt date (obiecte informaionale) ale cror valori se pot modifica n timpul execuiei programului. i variabilele sunt caracterizate de atributele nume, tip, valoare i clas de memorare. Variabilele sunt nume simbolice utilizate pentru memorarea valorilor introduse pentru datele de intrare sau a rezultatelor. Dac la o constant ne puteam referi folosind caracterele componente, la o variabil ne vom referi prin numele ei. Numele unei variabile ne permite accesul la valoarea ei, sau schimbarea valorii sale, dac este necesar acest lucru. Numele unei variabile este un identificator ales de programator. Ca urmare, trebuie respectate regulile enumerate n seciunea identificatori. Dac o dat nu are legturi cu alte date (de exemplu, relaia de ordine), vom spune c este o dat izolat. O dat izolat este o variabil simpl. Dac datele se grupeaz ntr-un anumit mod (n tablouri - vectori, matrici - sau structuri), variabilele sunt compuse (structurate). n cazul constantelor, n funcie de componena literalului, compilatorul stabilea, automat, tipul constantei. n cazul variabilelor este necesar specificarea tipului fiecreia, la declararea acesteia. Toate variabilele care vor fi folosite n program, trebuie declarate nainte de utilizare.

2.5.3.1. Declararea variabilelor


Modul general de declarare a variabilelor este: tip_variabile list_nume_variabile; Se specific tipul variabilei(lor) i o list format din unul sau mai muli identificatori ai variabilelor de tipul respectiv. ntr-un program n limbajul C++, declaraiile de variabile pot apare n orice loc n programul surs. La declararea variabilelor, se rezerv n memorie un numr de octei corespunztor tipului variabilei, urmnd ca ulterior, n acea zon de memorie, s fie depus (memorat, nregistrat) o anumit valoare. Exemple: int i, j;/*declararea var. simple i, j, de tip int. Se rezerv pentru i i j cte 16 bii (2octei)*/ char c; /* declararea variabilei simple c, de tip char. Se rezerv un octet. */ float lungime; /* declararea variabilei simple lungime; se rezerv 4 octei */

2.5.3.2. Iniializarea variabilelor n declaraii


n momentul declarrii unei variabile, acesteia i se poate da (asigna, atribui) o anumit valoare. n acest caz, n memorie se rezerv numrul de locaii corespunztor tipului variabilei respective, iar valoarea va fi depus (memorat) n acele locaii. Forma unei declaraii de variabile cu atribuire este: tip_variabil nume_variabil=expresie; Se evalueaz expresia, iar rezultatul acesteia este asignat variabilei specificate. Exemple: char backslash=\\; //declararea i iniializarea variabilei simple backslash int a=7*9+2; /* declararea variabilei simple a, de tip int i iniializarea ei cu valoarea 65*/ float radiani, pi=3.14;/*declararea variabilei radiani;declararea i iniializarea var. pi*/ short int z=3; //declararea i iniializarea variabilei simple z
29

CAPITOLUL 2 char d=\011; char LinieNoua=\n; double x=9.8, y=0;

Date, operatori i expresii

Compilatorul C++ furnizeaz mecanisme care permit programatorului s influeneze codul generat la compilare, prin aa-numiii calificatori. Acetia sunt: const; volatile. Calificatorul const asociat unei variabile, nu va permite modificarea ulterioar a valorii acesteia, prin program (printr-o atribuire). Calificatorul volatile (cel implicit) are efect invers calificatorului const. Dac dup calificator nu este specificat tipul datei, acesta este considerat tipul implicit, adic int. Exemple:
const float b=8.8; volatile char terminator;terminator=@;terminator=*; //permis b=4/5; //nepermisa modificarea valorii variabilei b const w; volatile g; //w, g de tip int, implicit

2.5.3.3. Operaii de intrare/ieire


Limbajele C/C++ nu posed instruciuni de intrare/ieire, deci de citire/scriere (ca limbajul PASCAL, de exemplu). n limbajul C aceste operaii se realizeaz cu ajutorul unor funcii (de exemplu, printf i scanf), iar n limbajul C++ prin suprancrcarea operatorilor (definirea unor noi proprieti ale unor operatori existeni, fr ca proprietile anterioare s dispar), mai precis a operatorilor >> i << . Vom folosi n continuare abordarea limbajului C++, fiind, n momentul de fa, mai simpl. n limbajul C++ sunt predefinite urmtoarele dispozitive logice de intrare/ieire: cin - console input - dispozitivul de intrare (tastatura); cout - console output - dispozitivul de ieire (monitorul). Aa cum se va vedea n capitolul 9, cin i cout sunt, de fapt, obiecte (predefinite). Transferul informaiei se realizeaz cu operatorul >> pentru intrare i operatorul << pentru ieire. Utilizarea dispozitivelor de intrare/ieire cu operatorii corespunztori determin deschiderea unui canal de comunicaie a datelor ctre dispozitivul respectiv. Dup operator se specific informaiile care vor fi citite sau afiate. Exemple: cout << var; /* afieaz valoarea variabilei var pe monitor*/ cin >> var; /* citete valoarea variabilei var de la tasatatur */ Sunt posibile operarii multiple, de tipul: Exemple:
cout << var1 << var2 << var3; cin >> var1 >> var2 >> var3;

n acest caz, se efectueaz succesiv, de la stnga la dreapta, scrierea, respectiv citirea valorilor variabilelor var1, var2 i var3. Operatorul >> se numete operator extractor (extrage valori din fluxul datelor de intrare, conform tipului acestora), iar operatorul << se numete operator insertor (insereaz valori n fluxul datelor de ieire, conform tipului acestora). Tipurile de date citite de la tastatur pot fi toate tipurile numerice, caracter sau ir de caractere. Tipurile de date transferate ctre ieire pot fi: toate tipurile numerice, caracter sau ir de caractere. Operanzii operatorului extractor (>>) pot fi doar nume de variabile. Operanzii operatorului insertor (<<) pot fi nume de variabile (caz n care se afieaz valoarea variabilei), constante sau expresii. Utilizarea dispozitivelor i operatorilor de intrare/ieire n C++ impune includerea fiierului iostream.h. Exemple:
char c; cout<<"Astept un caracter:";

//afiarea constantei ir de caractere, deci a mesajului

30

CAPITOLUL 2

Date, operatori i expresii

cin>>c; //citirea valorii variabilei c, de tip caracter int a, b, e; double d; cin>>a>>b>>e>>d; //citirea valorilor variabilelor a, b, e, d de tip int, int, int, double cout<<"a="<<a<<"Valoarea expresiei a+b este:"<<a+b<<'\n';

2.6. OPERATORI I EXPRESII


Datele (constante sau variabile) legate prin operatori, formeaz expresii (figura 2.4). Operatorii care pot fi aplicai datelor (operanzilor) depind de tipul operanzilor, datorit faptului c tipul unei date const ntr-o mulime de valori pentru care s-a adoptat un anumit mod de reprezentare n memoria calculatorului i o mulime de operatori care pot fi aplicai acestor valori. Operatorii pot fi: unari (necesit un singur operand); binari (necesit doi operanzi); ternari (trei operanzi). O expresie este o combinaie corect din punct de vedere sintactic, format din operanzi i operatori. Expresiile, ca i operanzii, au tip i valoare. 2.6.1. OPERATORI Operatorul unar adres &, aplicat identificatorului unei variabile, furnizeaz adresa la care este memorat aceasta. Poate fi aplicat oricrui tip de date i se mai numete operator de refereniere. Exemplu:

int a; cout<<"Adresa la care este memorata variabila a este:"<<&a;

Operatorul de atribuire (de asignare) este un operator binar care se aplic tuturor tipurilor de variabile. Este folosit sub formele urmtoare: nume_variabil=expresie; sau: expresie1=expresie2; Se evalueaz expresia din membrul drept, iar valoarea acesteia este atribuit variabilei din membrul stng. Dac tipurile membrilor stng i drept difer, se pot realiza anumite conversii, prezentate n paragraful 2.7. Exemplu:

float x; int a,b; x=9.18; a=b=10; int s; s=a+20*5; s=x+2;

//rezultat: s=110 //rezultat s=11, deoarece s este int.

Aa cum se observ n linia a 2-a din exemplul precedent, operatorul de atribuire poate fi utilizat de mai multe ori n aceeai expresie. Asociativitatea operatorului are loc de la dreapta la stnga. Astfel, mai nti b=10, apoi a=b. Exerciiu: S se scrie urmtorul program i s se urmreasc rezultatele execuiei acestuia.
#include <iostream.h> void main() { float x,y=4.25; char car=A; int a,b,c; cout<<Val. lui y este:<<y<<\n;

//Afiare: Val. lui y este:4.25 x=y; cout<<Val. lui x este:<<x<<\n; //Afiare: Val. lui x este:4.25 a=x;cout<<Val.lui a este:<<a<<\n; //Afiare:Val. lui a este:4, deoarece a de tip int!!! c=b=a; cout<<b=<<b<<\tc=<<c<<\n; //Afiare: b=4 c=4 cout<<Introducei val. lui c:; cin>>c; // citire val. pentru c
31

CAPITOLUL 2 cout<<Val. lui c este:<<c<<\n; }

Date, operatori i expresii

//Afiare: Val. lui c este:4

Operatorul poate fi aplicat tipurilor de date ntregi, reale, caracter, i chiar iruri de caractere, aa cum vom vedea n capitolele urmtoare (exemplu: char ir [10]=a5dfgthklj).

Operatori aritmetici unari: Operator Semnificaie Minus unar ++ Operator de incrementare (adun 1 la valoarea operandului) -Operator de decrementare (scade 1 din valoarea operandului) Operatorul - unar schimb semnul operandului. Exemplu:

Exemple -a a++ sau ++a a-sau --a

int a,b; cout<<a=<<-a<<\n; cout<<b=<<b<<\n;

b=-a;

Operatorul - unar poate fi aplicat datelor ntregi, reale, caracter. Operatorii de incrementare i decrementare pot fi aplicai datelor numerice sau caracter. Ambii operatori pot fi folosii n form prefixat, naintea operandului, (++a, respectiv --a) sau postfixat, dup operand (a++, respectiv a--). Operatorul de decrementare -- care poate fi folosit n form prefixat (--a) sau postfixat (a--).

Utilizarea acestor operatori n expresii, n form prefixat sau postfixat, determin evaluarea acestora n moduri diferite, astfel: y=++x y=x++ y=--x y=x-este echivalent cu: este echivalent cu: este echivalent cu: este echivalent cu: x=x+1; y=x; y=x; x=x+1; x=x-1; y=x; y=x; x=x-1;

Exerciiu: S se scrie urmtorul program i s se urmreasc rezultatele execuiei acestuia.


#include <iostream.h> void main() { int a=9; cout<<a++=<<a++<<\n; cout<<a=<<a<<\n; a=9; cout<<++a=<<++a<<\n; cout<<a=<<a<<\n; a=9; cout<<a--=<<a--<<\n; cout<<a=<<a<<\n; a=9; cout<<--a=<<--a<<\n; cout<<a=<<a<<\n; int z,x=3; z=x++-2; cout<<z=<<z<<\n; cout<<"x=<<x<<\n; x=3; z=++x-2; cout<<z=<<z<<\n; cout<<"x=<<x<<\n; } 32

//Afiare: a++=9 //Afiare: a=10 //Revenire in situatia anterioara //Afiare: ++a=10 //Afiare: a=10 //Afiare: a--=9 //Afiare: a=8 //Revenire in situaia anterioara //Afiare: --a=8 //Afiare: a=8 //Afiare: z=1 //Afiare: x=4 //Afiare: z=2 //Afiare: x=4

CAPITOLUL 2

Date, operatori i expresii

Operatori aritmetici binari: Operator Semnificaie Exemple + Adunarea celor doi operanzi a+b Scderea celor doi operanzi a-b * nmulirea celor doi operanzi a*b / mprirea celor doi operanzi a/b % Operatorul modulo (operatorul rest) a%b (furnizeaz restul mpririi operatorului stng la operatorul drept).

Operatorul modulo se aplic numai operanzilor ntregi (de tip int sau char). Ceilali operatori aritmetici binari pot fi aplicai datelor ntregi sau reale. Dac ntr-o expresie cu 2 operanzi i un operator binar aritmetic, ambii operanzi sunt ntregi, rezultatul expresiei va fi tot un numr ntreg. De exemplu, la evaluarea expresiei 9/2, ambii operanzi fiind ntregi, rezultatul furnizat este numrul ntreg 4. Operatorii prezentai respect o serie de reguli de preceden (prioritate) i asociativitate, care determin precis modul n care va fi evaluat expresia n care acetia apar. n tabelul 2.3 sunt prezentai operatorii anteriori, n ordinea descresctoare a prioritii. Precedena operatorilor poate fi schimbat cu ajutorul parantezelor. Tabelul 2.3. Clas de operatori Unari Multiplicativi Aditivi Atribuire Operatori - (unar) ++ * / % + = Asociativitate de la dreapta la stnga de la stnga la dreapta de la stnga la dreapta de la dreapta la stnga

--

Exerciiu: S se scrie urmtorul program i s se urmreasc rezultatele execuiei acestuia.


#include <iostream.h> void main() { int rezult, a=20,b=2,c=25,d=4; rezult=a-b; cout<<a-b=<<rezult<<\n; rezult=a+b; cout<<a+b=<<rezult<<\n; rezult=a*b;cout<<c*b=<<rezult<<\n; rezult=a/d; cout<<a/d=<<rezult<<\n; rezult=c%b; cout<<c%b=<<rezult<<\n; rezult=c/b*d; cout<<c/b*d=<<rezult<<\n; rezult= -b+a; cout<<-b+a=<<rezult<<\n; rezult= -(b+a); cout<<-(b+a)=<<rezult<<\n; rezult=b+c*d;cout<<b+c*d=<<rezult<<\n; rezult=(b+c)*d;cout<<(b+c)*d=<<rezult<<\n; }

// Afiare: a-b=18 // Afiare: a+b=22 // Afiare: c*b=50 // Afiare: a/d=5 // Afiare: c%b=1 // Afiare: c/b*d=48 // Afiare: -b+a=18 // Afiare: -(b+a)=-22 // Afiare: b+c*d=102 // Afiare: (b+c)*d=108

Operatori aritmetici binari compui Operator Semnificaie += a=a+b -= a=a+b *= a=a*b /= a=a/b %= a=a%b Aceti operatori se obin prin combinarea operatorilor folosii sub forma urmtoare: expresie1 operator= expresie2; Rezultatul obinut este acelai cu rezultatul obinut prin: expresie1 = expresie1 operator

Exemple a+=b a-=b a*=b a/=b a%=b aritmetici binari cu operatorul de atribuire i sunt

expresie2;

33

CAPITOLUL 2

Date, operatori i expresii

Toi aceti operatorii modific valoarea operandului stng prin adunarea, scderea, nmulirea sau mprirea acestuia prin valoarea operandului drept. Construcia x+=1 genereaz acelai rezultat ca expresia x=x+1. Observaiile referitoare la operatorii aritmetici binari sunt valabile i pentru operatorii aritmetici binari compui. Operatorii aritmetici binari compui au aceeai prioritate i asociativitate ca i operatorul de atribuire. Exerciiu: S se scrie urmtorul program i s se urmreasc rezultatele execuiei acestuia.
#include <iostream.h> void main() { int a,b; float c=9.3; a=3; b=8; cout<<a=<<a<<\n; a+=b; cout<<a=<<a<<\n; a-=b; cout<<a=<<a<<\n; a*=b; cout<<a=<<a<<\n; a/=b; cout<<a=<<a<<\n; a%=b; cout<<a=<<a<<\n; }

//Afiare //Afiare //Afiare //Afiare //Afiare //Afisare

a=3 a=11 a=-5 a=24 a=0 a=3

Operatori relaionali binari Operator Semnificaie Exemple == Egal cu a==b != Diferit de a!=b < Mai mic dect a<b <= Mai mic sau egal a<=b > Mai mare dect a>b >= Mai mare sau egal a>=b Primii doi operatori mai sunt numii operatori de egalitate. Operatorii relaionali servesc la compararea valorilor celor doi operanzi i nu modific valorile operanzilor. Rezultatul unei expresii n care apare unul din operatorii relaionali binari este ntreg i are valoarea zero (0) dac relaia este fals, sau valoarea unu (1) (sau diferit de 0 n cazul compilatoarelor sub UNIX), dac relaia este adevrat. Aceti operatorii pot fi aplicai datelor de tip ntreg, real sau char. Regulile de preceden i asociativitate ale acestor operatori sunt prezentate n tabelul 2.4. Tabelul 2.4. Clas de operatori Unari Multiplicativi Aditivi Atribuire Relaionali De egalitate Atribuire i aritmetici binari Operatori - (unar) ++ -* / % + = < <= > >= == != = *= /= %= += -= Asociativitate de la dreapta la stnga de la stnga la dreapta de la stnga la dreapta de la dreapta la stnga de la stnga la dreapta de la stnga la dreapta de la dreapta la stnga

Observaie: Deosebirea dintre operatorii == (relaional, de egalitate) i = (de atribuire) const n faptul c primul nu modific valoarea nici unuia dintre operanzii si, pe cnd cel de-al doilea modific valoarea operandului stng (vezi exemplul urmtor) Exerciiu: S se scrie urmtorul program i s se urmreasc rezultatele execuiei acestuia.
#include <iostream.h> void main() { int a=1, b=20, lim=100; int rezult; rezult=a<b; cout<<a<b=<<rezult<<\n;

// Afiare: a<b=1 (sau o alt valoare diferit de zero pentru alte compilatoare)
34

CAPITOLUL 2 rezult=a<=b;

Date, operatori i expresii

//operatorul realional <= are prioritate mai mare dect cel de atribuire
cout<<a<=b=<<rezult<<\n;

// Afisare: a<b=1 (sau o alta valoare diferit de zero pentru alte compilatoare) rezult=a>b; cout<<a>b=<<rezult<<\n; // Afiare: a<b=0
rezult=a+10>=lim; cout<<a+10>=lim=<<rezult<<\n;

/* Operatorul + are prioritate mai mare dect operatorul >= . Afiare: a+10>=lim=0 */
rezult=a+(10>=lim); cout<<a+(10>=lim)=<<rezult<<\n;

/* Schimbarea prioritatii operatorilor prin folosirea parantezelor; Afiare: a+(10>=lim)=1 */


rezult=a==b; cout<<a==b=<<rezult<<\n; // Afiare: a==b=0 cout<<a=<<a<<\n; // Afiare: a=1 cout<<b=<<b<<\n; // Afiare: b=20 rezult=a=b; cout<<a=b=<<rezult<<\n; // Afiare: a=b=20 cout<<a=<<a<<\n; // Afiare: a=20 cout<<b=<<b<<\n; // Afiare: b=20 rezult=5>b>10;cout<<b=<<b<<\n; // Afiare: b=20 cout<<5>b>10=<<rezult<<\n; //Echivalent cu (5>b)>10 Afiare: 5>b>10=0 }

Operatori logici pe cuvnt Operator Semnificaie Exemple ! Not (negaie logic) !(a==b) && And (conjuncie, i logic) (a>b) && (b>c) || Or (disjuncie, sau logic) (a>b) || (b>c) Aceti operatori pot fi aplicai datelor de tip ntreg, real sau caracter. Evaluarea unei expresii n care intervin operatorii logici se face conform tabelului 2.5.

Tabelul 2.5. x y !x x&&y x||y adevrat (1) adevrat (1) fals (0) adevrat (1) adevrat (1) adevrat (1) fals (0) fals (0) fals (0) adevrat (1) fals (0) adevrat (1) adevrat (1) fals (0) adevrat (1) fals (0) fals (0) adevrat (1) fals (0) fals (0) Expresia !expresie are valoarea 0 (fals) dac expresia-operand are o valoare diferit de zero i valoarea unu (adevrat) dac expresia-operand are valoarea zero. Expresia expresie1||expresie2 are valoarea diferit de 0 (true) dac FIE expresie1, FIE expresie2 au valori diferite de zero. Expresia expresie1 && expresie2 are valoarea diferit de 0 (true) dac AMBELE expresiioperand ( expresie1 i expresie2) au valori diferite de zero. Exerciiu: S se scrie urmtorul program i s se urmreasc rezultatele execuiei acestuia.
#include <iostream.h> void main() { int a=0, b=10, c=100, d=200; int rezult; rezult=a&&b; cout<<a&&b=<<rezult<<\n; //Afiare a&&b=0 rezult=a||b; cout<<a||b=<<rezult<<\n;//Afiare a||b=1 (sau valoare nenula) rezult=!a;cout<<!a=<<rezult<<\n; //Afiare !a=1 (sau valoare nenula) rezult=!b; cout<<!b=<<rezult<<\n; //Afiare !b=0 rezult=(a>b) || (b>c);cout<<(a>b) || (b>c)=<<rezult<<\n;

//Afiare (a>b) || (b>c) =1(sau valoare nenula)


rezult=!(c<d);cout<<!(c<d)=<<rezult<<\n;//Afiare !(c>d)=0 rezult=(a-b)&&1;cout<<(a-b)&&1=<<rezult<<\n;

//Afiare (a-b)&&1 =1(sau valoare nenula)


rezult=d||b&&a;cout<<d||b&&a=<<rezult<<\n;//Afiare d||b&&a =1 }// n evaluarea expresiilor din exemplu, s-au aplicat prioritile operatorilor, indicate n tabelul. 2.6. 35

CAPITOLUL 2

Date, operatori i expresii

Tabelul 2.6. Clas de operatori Unari Multiplicativi Aditivi Atribuire relaionali de egalitate logici logici atribuire i aritmetici binari

Operatori ! - (unar) ++ -* / % + = < <= > >= == != && || = *= /= %= += -=

Asociativitate de la dreapta la stnga de la stnga la dreapta de la stnga la dreapta de la dreapta la stnga de la stnga la dreapta de la stnga la dreapta de la stnga la dreapta de la stnga la dreapta de la dreapta la stnga

Exerciiu: S se scrie un program care citete un numr real i afieaz 1 dac numrul citit aparine unui interval ale crui limite sunt introduse tot de la tastatur, sau 0 n caz contrar.
#include <iostream.h> void main() { double lmin, lmax, nr;cout<<"Numar=";cin>>nr; cout<<Limita inferioar a intervalului:; cin>>lmin; cout<<Limita superioar a intervalului:; cin>>lmax; cout<<(nr>=lmin && nr<=lmax); }

Operatori logici pe bit Operator Semnificaie ~ Negaie (cod complementar fa de unu) & AND (Conjuncie, i logic pe bit | OR (Disjuncie, sau logic pe bit) ^ XOR (Sau exclusiv logic pe bit) << Deplasare stnga >> Deplasare dreapta

Exemple ~a a & 0377 a | 0377 a^b 0377 << 2 0377 >> 2

Aceti operatori nu se aplic numerelor reale, ci numai datelor de tip ntreg sau caracter. Primul operator este unar, ceilali binari. Operatorii acioneaz la nivel de bit, la nivelul reprezentrii interne (n binar), conform tabelelului 2.7. Tabelul 2.7. x 1 1 0 0 y 1 0 1 0 x&y 1 0 0 0 x|y 1 1 1 0 x^y 0 1 1 0 ~x 0 0 1 1

Operatorul ~ are aceeai prioritate ca i ceilali operatori unari. El furnizeaz complementul fa de unu al unui ntreg, adic va schimba fiecare bit de pe 1 n zero i invers. Operatorii de deplasare pe bit ( << i >>) efectueaz deplasarea la stnga sau la dreapta a operandului stng, cu numrul de bii indicai de operandul drept. Astfel, x<<2 deplaseaz biii din x la stnga, cu dou poziii, introducnd zero pe poziiile rmase vacante. Exemple: int a=3; //Reprezentare intern a lui a (pe 2 octei): 0000000000000011 int b=5; //Reprezentare intern a lui b (pe 2 octei): 0000000000000101
int rez=~a; cout<<"~"<<a<<'='<<rez<<'\n'; //~3= -4

//Complementul fa de unu este: 1111111111111100 (n octal: 0177777774 (!a= - 4) rez=a & b; cout<<a<<'&'<<b<<'='<<rez<<'\n'; //3&5=1 //a&b=0000000000000001 =1
36

CAPITOLUL 2 rez=a^b; cout<<a<<'^'<<b<<'='<<rez; // 3^5= 6

Date, operatori i expresii

//a ^b = 0000000000000110
rez=a|b; cout<<a<<'|'<<b<<'='<<rez;

//3|5= 7 //3<<2=16=2*2 3 //5>>2=1=5/2 2

//a | b = 0000000000000111
rez=a<<2; cout<<a<<"<<"<<3<<'='<<rez;

//a<<2= 0000000001100000
rez=5>>2; cout<<b<<">>"<<2<<'='<<rez;

//b>>2= 0000000000000001 Operatorul binar ^ i gsete o utilizare tipic n expresii ca: x&^077, care mascheaz ultimii 6 bii ai lui x pe zero. Operatorul & este adesea utilizat n expresii ca x &0177, unde seteaz toi biii pe zero, cu excepia celor de ordin inferior din x. Operatorul | este utilizat n expresii ca: x&MASK , unde seteaz pe unu biii care n x i masca MASK sunt setai pe unu. Operatorii logici pe bit & i | sunt diferii de operatorii logici && i || (pe cuvnt). Deplasarea la stnga a unei date cu n poziii este echivalent cu nmulirea valorii acesteia cu 2 n . Deplasarea la dreapta a unei date fr semn cu n poziii este echivalent cu mprirea valorii acesteia cu 2 n . Combinnd operatorii logici pe bit cu operatorul de atribuire, se obin operatorii: &=, ^=, |=, <<=, >>=. Operatorul condiional Este un operator ternar (necesit 3 operanzi), utilizat n construcii de forma: expresie1?expresie2:expresie3

Se evalueaz expresia1. Dac aceasta are o valoare diferit de zero, atunci tipul i valoarea ntregii expresii vor fi aceleai cu tipul i valoarea expresiei2. Altfel (dac expresie1 are valoarea zero), tipul i valoarea ntregii expresii vor fi aceleai cu tipul i valoarea expresiei3. Deci operatorul condiional este folosit pentru a atribui ntregii expresii tipul i valoarea expresiei2 sau a expresiei3, n funcie de o anumit condiie. Acest lucru este echivalent cu: Dac expresie1 diferit de zero Atunci evalueaz expresie2 Altfel evalueaz expresie3 Exemplu:
int semn=(x<0)?-1:1

Dac x<0, atunci semn=-1, altfel semn=1. Operatorul virgul Este utilizat n construcii de forma: expresie1 , expresie2 Operatorul virgul foreaz evaluarea unei expresii de la stnga la dreapta. Tipul i valoarea ntregii expresii este dat de tipul i valoarea expresiei2 . Operatorul virgul este folosit n instruciunea for. Operatorul virgul are cea mai mic prioritate. Exemplu:

int x, c, y; cout<<Astept val. ptr. y:; cin>>y; x=(c=y, c<=5); /* c va primi valoarea lui y (citit); se verific dac c este mai mic sau x++, y--;

egal cu 5. Daca nu, x=0; daca da, x=1 sau x=valoare diferit de zero)*/ //nti este incrementat x, apoi este decrementat y

Operatorul sizeof() Este un operator unar, care are ca rezultat numrul de octei pe care este memorat o dat de un anumit tip. Operandul este un tip sau o dat (constant sau variabil) de un anumit tip. Exemple: cout<<sizeof(int); // afieaz numrul de octei pe care este memorat un ntreg (2)

37

CAPITOLUL 2

Date, operatori i expresii

cout<<sizeof(ab6*);// afieaz 5, nr. de octei pe care este memorat constanta ir ab6*

Operatorul (tip) Este un operator unar care apare n construcii numite cast i convertete tipul operandului s u la tipul specificat ntre paranteze. Exemple: int a; (float) a; // convertete operandul a (care era de tip ntreg) n float

n afara operatorilor prezentai, exist i alii, pe care i vom enumera n continuare. Despre aceti operatori vom discuta n capitolele viitoare, cnd cunotinele acumulate vor permite acest lucru. Operatorul unar * Este operator unar, numit i operator de defereniere. Se aplic unei expresii de tip pointer i este folosit pentru a accesa coninutul unei zone de memorie spre care pointeaz operatorul. Operatorii & (adres) i * sunt complementari. Exemplu: Expresia *a este nlocuit cu valoarea de la adresa coninut n variabila pointer a.

Operatorii parantez Parantezele rotunde ( ) se utilizeaz n expresii, pentru schimbarea ordinii de efectuare a operaiilor, sau la apelul funciilor. La apelul funciilor, parantezele rotunde ncadreaz lista parametrilor efectivi. Din acest motiv, parantezele rotunde sunt numite i operatori de apel de funcie. Exemplu:

double sum(double a, double b);

/*declar. funciei sum, care primete 2 argumente reale(double) i returneaz o valoare tip double */
void main() { . . . double a=sum(89.9, 56.6); //apelul funciei sum, cu parametri efectivi 89.9 i 56.6 int s0=6; double s1=(s0+9)/a; //folosirea parantezelor n expresii . . . }

Operatorii de indexare Operatorii de indexare sunt parantezele ptrate []. Acestea includ expresii ntregi care reprezint indici ai unui tablou. Operatori de acces la membri structurilor Operatorii ::, ., ->, .* i ->* permit accesul la componentele unei structuri. Ei vor fi studiai n capitolul 7.

n tabelul 2.8. sunt prezentai toi operatorii, grupai pe categorii, cu prioritile lor i regulile de asociativitate. Operatorii dintr-o categorie au aceeai prioritate. Tabelul 2.8. Nr. Clas de operatori 1. Primari 2. Unari 3. 4. 5. 6. 7. 8. Multiplicativi Aditivi Deplasare pe bit Relaionali De egalitate Operatori () [] . -> :: ! ~ ++ -- sizeof (tip) -(unar) *(defereniere) &(refereniere) * / % + << >> < <= > >= == != & (I logic pe bit) Asociativitate de la stnga la dreapta de la stnga la dreapta de la stnga la dreapta de la stnga la dreapta de la stnga la dreapta de la stnga la dreapta de la stnga la dreapta de la stnga la dreapta

38

CAPITOLUL 2

Date, operatori i expresii

9. 10. 11. 12. 13. 14. 15.

Condiional De atribuire Virgul

^ (XOR pe bit) | (SAU logic pe bit) && || ?: = += -= *= %= &= ^= |= <<= >>= ,

de la stnga la dreapta de la stnga la dreapta de la stnga la dreapta de la stnga la dreapta de la dreapta la stnga de la dreapta la stnga de la stnga la dreapta

2.6.2. EXPRESII Prin combinarea operanzilor i a operatorilor se obin expresii. Tipul unei expresii este dat de tipul rezultatului obinut n urma evalurii acesteia. La evaluarea unei expresii se aplic regulile de prioritate i asociativitate a operatorilor din expresie. Ordinea de aplicare a operatorilor poate fi schimbat prin folosirea parantezelor. La alctuirea expresiilor, este indicat evitarea expresiilor n care un operand apare de mai multe ori. 2.6.3. CONVERSII DE TIP La evaluarea expresiilor, se realizeaz conversii ale tipului operanzilor. Conversiile sunt: Automate; Cerute de evaluarea expresiilor; Cerute de programator (prin construciile cast), explicite. Conversiile automate sunt realizate de ctre compilator: char, short int -> int Ele sunt realizate de fiecare dat cnd ntr-o expresie apar operanzi de tipul char sau short int. Conversiile cerute de evaluarea expresiilor sunt efectuate n cazurile n care n expresii apar operanzi de tipuri diferite. naintea aplicrii operatorilor, se realizeaz conversia unuia sau a ambilor operanzi: Dac un operand este de tip long int, cellalt este convertit la acelai tip; tipul expresiei este long int. Dac un operand este de tipul double, cellalt este convertit la acelai tip; tipul expresiei este double. Dac un operand este de tipul float, cellalt este convertit la acelai tip; tipul expresiei este float. Conversiile explicite (cerute de programator) se realizeaz cu ajutorul construciilor cast. Exemplu:
int x=3; float y; y=(float)x/2;

nainte de a se efectua mprirea celor 2 operanzi, operandul x (ntreg) este convertit n numr real simpl precizie. Dup atribuire, valoarea lui y va fi 1.5. Dac nu ar fi fost folosit operatorul de conversie n expresia y=x / 2, operanzii x i 2 fiind ntregi, rezultatul mpririi este ntreg, deci y ar fi avut valoarea 1.

NTREBRI I EXERCIII Chestiuni teoretice


1. Ce reprezint datele i care sunt atributele lor? 2. Care sunt diferenele ntre constante i variabile? 3. Cine determin tipul unei constante? 4. Ce sunt identificatorii? 5. Ce sunt directivele preprocesor? 6. Ce reprezinta variabilele? 7. Ce sunt constantele? 8. Enumerai tipurile simple de variabile. 9. Cte tipuri de directive preprocesor cunoastei? Exemple. 10. Care este modalitatea de a interzice modificarea valorii unei variabile? 11. Ce loc ocup declararea varibilelor n cadrul unui program surs scris n limbajul C++? 12. Ce conin fiierele header? 13. Ce tipuri de variabile se utilizeaz pentru datele numerice? 14. Care sunt calificatorii folosii alturi de tipurile de baz pentru obinerea tipurilor derivate de date? 15. Ce semnific parantezele unghiulare < > care ncadreaz numele unui fiier header? 16. Care este diferena ntre constantele 35.2e-1 i 3.52 ? Dar ntre "\t" i '\t'? 17. Ce tip are constanta 6.44 ? 18. Care este diferena ntre operatorii = i = = ?
39

CAPITOLUL 2

Date, operatori i expresii

19. 20. 21. 22. 23.

Ce reprezint caracterele "escape"? Constante ntregi. Constante caracter. Ce tipuri de conversii cunoatei? Care sunt conversiile realizate n mod automat, de ctre compilator? 24. Constante ir de caractere. Chestiuni aplicative

25. 26. 27. 28. 29. 30. 31.

Constante reale. Ce operatori ternari cunoastei? Operatorul virgul. Operatorul sizeof. Operatori aritmetici binari compui. Operatorul de refereniere. Operatori relaionali binari.

1. S se scrie declaraiile pentru definirea constantelor simbolice: pi, g (acceleraia gravitaional), unghi_drept, dimensiune_MAX. 2. Care va fi rezultatul afiat pe ecran n urma execuiei urmtoarelor secvene de instruciuni:

double a=9/2; cout<<a*5<<\n; double a=9.7, b=5.6; cout<<(a+6<b)<<\n; double a=9/4; cout<<a*6<<\n; double x=3;int y=++x+5;cout<<y<<\n; int a=7; cout<<(!a)<<\n; int a=10.5; cout<<a++<<\n; cout<<a<<\n; int a=7; cout<<++a<<\n; cout<<a<<\n; int a=10; cout<<a++<<\n; cout<<a<<\n;

double a=7/2; cout<<a<<\n; int x=3; int y=x++-2; cout<<y<<\n;

int x=3; int y=++x+5; cout<<y<<\n; double a=5.6, b=7.45; cout<<(a>b)<<\n; double a=9.7, b=5.2; int c=(a+6<b)++; cout<<c<<\n; double a=7/5; double c=a*5++; cout<<c<<\n; double a=9.7, b=5.6; int c=(a%6<b)++; cout<<c<<\n; double a=5.6, b=7.45; cout<<++(a+5>b)<<\n; double a=9.8; double b=9.7; cout<<a%b<<\n; cout<<&(a+8)<<'\n'; int I=8; cout<<(I+10)++<<'\n'; double a=8.7; A=(a+8)/56; cout<<A<<'\n'; int x=3/5; int y=x++; char x='J'; cout<<"y="<<y<<'\n'; char a='X'; const int b=89; b+=8; cout<<"b="<<b<<" a="<<a<<'\n';

3. S se verifice corectitudinea urmtoarelor secvene. Pentru cele incorecte, explicai sursa erorilor.

4. S se scrie un program care afieaz urmtoarele mesaje: Sirul "este dupa-amiaza" este memorat pe .... octeti. O marime intreaga este memorata pe ... octeti. O marime reala, in simpla precizie este memorata pe ... octeti! O marime reala, in dubla precizie este memorata pe ... byti! Constanta caracter 'Q' memorata pe ... octeti! Sirul "a\n\n" este memorat pe ... octei! Sirul "\n" este memorat pe ... biti! Caracterul '\' este memorat pe .... biti. 5. S se evalueze expresiile, tiind c: int i=1;int j=2;int k=-7;double x=0;double y=2.3;

-i - 5 * j >= k + 1 3 < j < 5 i + j + k == -2 * j x && i || j - 3

6. Ce operaie logic i ce masc trebuie s folosii pentru a converti codurile ASCII ale literelor mici n litere mari? Dar pentru conversia invers? 7. O deplasare la dreapta cu 3 bii este echivalent cu o rotaie la stnga cu ci bii? 8. S se seteze pe 1 toi biii dintr-un octet, cu excepia bitului cel mai semnificativ. 9. S se scrie un program care citete o valoare ntreag. S se afieze un mesaj care s indice dac numrul citit este par sau impar. 10. S se citeasca dou valori ntregi. S se calculeze i s se afieze restul mpririi celor dou numere.

40

You might also like