Documente Academic
Documente Profesional
Documente Cultură
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.
Program Fiiere header
Fiier surs
O expresie este o structur corect sintactic, format din operanzi i operatori (figura 2.2.c.).
FUNCII INSTRUCIUNI EXPRESII
Instruciunea1 Operanzi
Instruciunea2 Expresie;
Instruciunea3
.
.
.
.
Operatori
2.2.a. 2.2.b. 2.2.c
Figura 2.2. Funcie, instruciune, expresie
Pentru a nelege mai bine noiunile prezentate, s considerm un exemplu foarte simplu:
programul afieaz pe ecran un mesaj (mesajul Primul meu program). Informaia de prelucrat
(de intrare) este chiar mesajul (o constant ir), iar prelucrarea ei const n afiarea pe ecran.
Exemplul 2.1.:
#include <iostream.h> // linia 1
int main() // linia 2 - antetul funciei main
{ /* linia 3 - nceputul corpului funciei, a unei intruciuni
compuse (linia 4)*/
cout<<Primul meu program in limbajul C++\n; // linia 5
return 0; // linia 6
} // linia7-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 1 include elemente de
intrare/ieire - din biblioteca standard C++ - care permit realizarea afirii pe monitor.
Programul conine doar o funcie, funcia principal, main, al crui antet (linia 2) indic:
- tipul valorii returnate de funcie (int, ceea ce nseamn c funcia returneaz o valoare
ntreag);
- numele funciei (main)
- lista declaraiilor 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:
int 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 prin simbolurile
/*, iar sfritul - prin */ (vezi liniile 3, 4). Introducerea comentariilor n programele surs
uureaz nelegerea acestora. n general, se recomand introducerea unor comentarii dup
1
Elementele bibliotecii standard C++ sunt declarate n spaiul numelor (engl., namespace) std. O soluie mai
nou este aceea de a declara la nceputul fiierului surs utilizarea acestui spaiu, prin:
using namespace std;
n acest caz, extensia header-ului (.h) poate fi omis.
Mai multe informaii despre spaiul numelor gsii n materialul Observaii generale.
Autor: Diana tefnescu 24
CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii
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),
respectiv }(linia 7).
Corpul funciei (liniile 5, 6) este format dintr-o singur prelucrare, care implementeaz o
operaie de ieire (scriere). n linia 5, cuvntul cout este un cuvnt predefinit (un obiect 2 ) al
limbajului C++ - console output - care desemneaz dispozitivul logic de ieire; simbolul <<
este operatorul de transfer al 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 a ecranului. 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 ; .
n linia 6, instruciunea return produce ncheierea execuiei programului, prin revenirea din
funcia main. Instruciunea este folosit la genera un cod numeric ntreg, iar codul 0 nseamn
c programul s-a ncheiat fr erori. Este cel mai obinuit mod de a ncheia un program C++ 3 .
2.2. PREPROCESORUL
Aa cum s-a menionat n capitolul 1.5., n faza de compilare a fiierului surs este invocat
mai 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:
2
cout un obiect din biblioteca standard C++, care face parte din namespace-ul std.
3
Dac pentru funcia main ai uitat s folosii instruciunea return, aa cum ar trebui, majoritatea
compilatoarelor iart acest lucru, considernd automat c o execuie corect a programului (a funciei main)
determin returnarea codului 0.
Autor: Diana tefnescu 25
CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii
Exemplul 2.4.:
#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.4.
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.
Exemplul 2.6.:
#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 indicat (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) -x
NEGATIV(a+b) ar fi fost tratat ca -a+b.
2.3.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 de subliniere ( _ underscore), folosit, de obicei, ca element de legtur ntre
cuvintele compuse;
Cifrele zecimale (0-9);
Simboluri speciale:
Caractere care reprezint:
operatori (Exemple: +, *, !=);
delimitatori (Exemple: blank (spaiu), tab \t, newline \n, cu rolul de a separa
cuvintele limbajului);
Grupuri de caractere (perechi de caractere).
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 sugestiv.
Cuvintele cheie sunt cuvinte ale limbajului, mprumutate, de obicei, 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 msur ce vor fi prezentate construciile n care
acestea apar.
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.
n completare exist un numr de calificatori, care se pot aplica tipurilor de baz char, int,
float sau double: short, long, signed i unsigned. Prin alturarea acestor
calificatori tipurilor de baz, 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
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 i tipului char. Calificatorul long se aplic
i tipului double. Dac ntr-o declaraie se omite tipul de baz, implicit, acesta va fi int.
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 date de tip int se folosesc 2 octei de memorie, atunci
1
valoarea maxim pentru aceasta va fi 2 16 - 1, deci 2 15 - 1 (32767), iar valoarea minim va
2
1
fi - 2 16 , deci -2 15 (-32768). ncercarea de a calcula o expresie de tip int a crei valoare se
2
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].
Majoritatea mediilor C++ ofer fiiere header cu declaraii ale constantelor simbolice legate
de specificul compilatorului i al mainii pe care se lucreaz. n cazul BorlandC++-ului, un
astfel de fiier header este <values.h>; aici sunt definite constantele simbolice (cum ar fi:
MAXINT, MAXSHORT, MAXLONG, MINDOUBLE, MINFLOAT, etc.) care au ca valori limitele
inferioar i superioar ale intervalului de valori pentru tipurile de date enumerate (de
Autor: Diana tefnescu 28
CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii
exemplu, MAXINT reprezint valoarea ntregului maxim care se poate memora). n cazul dev-
C++-ului, astfel de fiiere header sunt <limits.h> (n care sunt declarate constantele
simbolice INT_MAX i INT_MIN) i <float.h> (n care sunt declarate constantele
simbolice FLT_MAX i DBL_MAX)
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.
Tabelul 2.1.
Tip Lungimea zonei Descriere
de memorare (n
bii)
MS- UNIX
DOS LINUX
char 8 8 Valoarea unui singur caracter; poate fi ntlnit n
expresii cu extensie de semn
unsigned 8 8 Aceeai ca la char, fr extensie de semn
char
signed char 8 8 Aceeai ca la char, cu extensie de semn obligatorie
int 16 32 Valoare ntreag
long 32 64 Valoare ntreag cu precizie mare
(long int)
long long 32 64 Valoare ntreag cu precizie mare
int
short int 16 32 Valoare ntreag cu precizie mic
unsigned int 16 32 Valoare ntreag, fr semn
unsigned 32 64 Valoare ntreag, fr semn
long int
float 32 32 Valoare numeric cu zecimale, simpl precizie (6 )
double 64 64 Valoare numeric cu zecimale, dubl precizie (10 )
long double 80 128 Valoare numeric cu zecimale, dubl precizie
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.
Exemplul 2.8.:
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.4.2. CONSTANTE
O constant este un literal (o form extern de reprezentare a unei valori n fiierul surs)
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.
Constantele ntregi sunt literali numerici (compui din cifre), fr punct zecimal.
Exemplul 2.16.:
0.45f //tip float
9.788L //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. n forma extern de reprezentare, baza de numeraie este 10, deci
exp onent
valoarea constantei va fi dat de mantisa 10 .
Exemplul 2.17.: 1.5e-2 //tip double, n notaie tiinific, valoare 1.5 10 2
Caracterele sunt simboluri care reprezint litere, cifre, semne de punctuaie, etc. Constantele
caracter sunt ncadrate ntre apostroafe.
Exemplul 2.18.:
'a' //tip char
Caracterele sunt reprezentate intern printr-un numr ntreg, fr semn, memorat pe 1 octet.
Valoarea numrului este aa-numitul cod ASCII (American Standard Code for Information
Interchange) al caracterului pe care l reprezint. Codul ASCII 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.).
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.
Exemplul 2.20.:
\11 (pentru \t)
reprezint constanta caracter backspace, cu codul 9 n baza 10, deci codul 11 n baza 8.
\15 (pentru \r)
reprezint constanta caracter CR, cu codul 13 n baza 10, deci codul 11 n baza 8.
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 caracterelor componente ale irului.
Exemplul 2.2.:
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 //const ir memorat pe 2 oct. (codul caracterului escape i terminatorul de ir)
a\a4 /*ir memorat pe 4 octei:
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*/
Autor: Diana tefnescu 33
CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii
\\ASCII\\ /*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 C
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 */
1\175a /*ir memorat pe 4 octei:
Primul octet: Codul ASCII al caracterul 1
Al 2-lea octet: codul ASCII 125 (175 in octal) al car. }
Al 3-lea octet: codul ASCII al caracterului a
Al 4-lea octet: codul ASCII 0 pentru terminatorul irului */
2.4.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 zona de memorie rezervat variabilei, deci
accesul la valoarea sa (afiarea sau modificarea acesteia). 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).
Se specific tipul variabilei(lor) i o list format din unul sau mai muli identificatori ai
variabilelor de tipul respectiv.
Exemplul 2.22.:
int i, j;
/*declararea var. simple i, j, 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 */
n momentul declarrii unei variabile, acesteia i se 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_var> <nume_var1>=<expr1>[,<nume_var2>=<expr2>, ];
Se evalueaz expresia1, iar rezultatul acesteia este asignat variabilei specificate prin
nume_var1. Analog se procedeaz, cnd este cazul, pentru toate variabilele care apar n
declaraia cu iniializare.
Exemplul 2.23.:
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 cu valoarea 3.14*/
short int z=3; //declararea i iniializarea variabilei simple z
char d=\011;
char LinieNoua=\n;
double x=9.8, y=0;
//declararea variabilelor simple x i y i iniializarea lor cu valorile 9.8, respectiv 0
Exemplul 2.24.:
const float b=8.8;
volatile char terminator;terminator=@;terminator=*;//permis
b=4/5; //nepermis modificarea valorii variabilei b
const w; volatile g; //w, g de tip int (implicit)
Exemplul 2.25.:
cout << var; /* afieaz valoarea variabilei var pe monitor*/
cin >> var; /* citete valoarea variabilei var de la tasatatur */
Exemplul 2.26.:
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 (se afieaz valoarea variabilei), constante sau expresii. Utilizarea dispozitivelor i
operatorilor de intrare/ieire n C++ impune includerea fiierului header iostream.h.
Exemplul 2.27.:
char c;
cout<<"Astept un caracter:";//afiarea const. ir de caract., deci a mesajului
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';
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.5.1. OPERATORI
Operatorul unar adres & (numit i operator de refereniere), aplicat unei variabile,
furnizeaz adresa la care este memorat aceasta. Poate fi aplicat datelor de orice tip.
Exemplul 2.28.:
int a; cout<<"Adr. la care este mem. 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.
Exemplul 2.19.:
float x; int a,b; x=9.18;
a=b=10;
int s; s=a+20*5; //rezultat: s=110
s=x+2; //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 (ordinea de grupare) operatorului
are loc de la dreapta la stnga. Astfel, mai nti b=10, apoi a=b.
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).
Exemplul 2.30.:
int a,b; cout<<a=<<-a<<\n; b=-a;
cout<<b=<<b<<\n;
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 apar 2 operanzi ntregi i un operator binar aritmetic, 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.
Tabelul 2.3.
Clas de operatori Operatori Asociativitate
Unari & - (unar) ++ -- de la stnga la dreapta
Multiplicativi * / % de la stnga la dreapta
Aditivi + - de la stnga la dreapta
Atribuire = de la dreapta la stnga
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.
Primii doi operatori mai sunt numii operatori de egalitate. Operatorii relaionali compar
valorile celor doi operanzi, fr a le modifica. Rezultatul unei expresii n care apare un
operator relaional binar 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 caracter.
Aceti operatori (primul unar, ceilali binari) pot fi aplicai datelor numerice sau caracter.
Evaluarea expresiilor n care intervin operatorii logici pe cuvnt se face conform tabelului 2.4.
Tabelul 2.4.
x y !x x&&y x||y
1 (adevrat) 1 (adevrat) 0 (fals) 1 (adevrat) 1 (adevrat)
1 (adevrat) 0 (fals) 0 (fals) 0 (fals) 1 (adevrat)
0 (fals) 1 (adevrat) 1 (adevrat) 0 (fals) 1 (adevrat)
0 (fals) 0 (fals) 1 (adevrat ) 0 (fals) 0 (fals)
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.
Exerciiul 2.10.: S se scrie un program care citete un numr real i afieaz 1 dac numrul
citit aparine unui interval ale crui limite sunt introduse de la tastatur, sau 0 n caz contrar.
#include <iostream.h>
int 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); }
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, conform
tabelelului 2.5.
Tabelul 2.5.
x y x&y x|y x^y ~x
1 1 1 1 0 0
1 0 0 1 1 0
0 1 0 1 1 1
0 0 0 0 0 1
Exemplul 2.31.:
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
rez=a^b; cout<<a<<'^'<<b<<'='<<rez; // 3^5= 6
//a ^b = 0000000000000110
rez=a|b; cout<<a<<'|'<<b<<'='<<rez; //3|5= 7
//a | b = 0000000000000111
rez=a<<2; cout<<a<<"<<"<<3<<'='<<rez; //3<<2=16=2*2 3
//a<<2= 0000000001100000
rez=5>>2; cout<<b<<">>"<<2<<'='<<rez; //5>>2=1=5/2 2
//b>>2= 0000000000000001
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
Exemplul 2.32.:
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> [, <expresie3>, . . . ]
Operatorul virgul foreaz evaluarea unei expresii de la stnga la dreapta; tipul i valoarea
ntregii expresii este dat de tipul i valoarea ultimei expresii. Operatorul virgul este folosit
n cadrul instruciunii for. Operatorul virgul are cea mai mic prioritate.
Exemplul 2.33.:
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 egal cu 5. Daca nu, x=0; daca da, x=1 sau x=valoare diferit de zero)*/
x++, y--; //nti este incrementat x, apoi este decrementat y
Operatorul sizeof()
Este un operator unar, care furnizeaz numrul de octei pe care este memorat o dat
de un anumit tip. Operandul este un tip sau o dat (constant sau variabil).
Exemplul 2.34.:
cout<<sizeof(int);// afieaz nr. de octei pe care este memorat un ntreg (2)
int a=8; cout<<sizeof(a)<<sizeof(20)<<'\n';
//afieaz nr. de oct. pe care este memorat var. ntreag a, respectiv const. ntreag 9
cout<<sizeof(ab6*);//afieaz 5, nr. oct. pe care este mem. const. ir ab6*
Operatorul (tip)
Este un operator unar care apare n construciile numite cast i convertete tipul
operandului su la tipul specificat ntre paranteze.
Exemplul 2.35.:
int a=9; cout<<(float)a/2; // conv. operandul a (de tip int) n float; afi. 4.5
n afara operatorilor prezentai, exist i ali operatori, enumerai 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, de refereniere) i * sunt complementari.
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.
Exemplul 2.37.:
double sum(double a, double b);
/*declar. funciei sum, care are 2 arg. reale(double) i returneaz o val. de tip double */
int main()
{
. . .
double a=sum(89.9,56.6);//apelul funciei sum, cu param. 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 ncadreaz expresii
ntregi care reprezint indici ntr-un tablou (vector, matrice, etc.).
n tabelul 2.6. sunt prezentai toi operatorii, grupai pe categorii, cu prioritile lor i regulile
de asociativitate. Operatorii dintr-o categorie au aceeai prioritate.
2.5.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 care apar n expresie. Ordinea de aplicare a
operatorilor poate fi schimbat prin folosirea parantezelor. La alctuirea expresiilor, este
indicat evitarea expresiilor n care acelai operand apare de mai multe ori.
Exemplul 2.37.:
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 (float). 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.
Exemplul 2.38.:
int a,b,c; char x,y,z; float n1; a = b = c = -27;
x = y = z = 'A'; n1=3.6792; a = y; /* a = 65 (codul caracterului A) */
x = b; n1 = b; a = n1; /* x = -27 n1= -27.00 a = 3 */
NTREBRI
1. Ce reprezint datele i care sunt atributele 12. Ce tipuri de variabile se utilizeaz pentru
lor? datele numerice?
2. Care sunt diferenele ntre constante i 13. Care este diferena ntre constantele
variabile? 35.2e-1 i 3.52 ? Dar ntre "\t" i '\t'?
3. Cine determin tipul unei constante? 14. Ce tip are constanta 6.44 ?
4. Ce sunt identificatorii? 15. Diferena dintre operatorii = i = =.
5. Ce sunt directivele preprocesor? 16. Ce reprezint caracterele "escape"?
6. Ce reprezint variabilele? 17. Constante ntregi.
7. Ce sunt constantele? 18. Ce tipuri de conversii cunoatei?
8. Enumerai tipurile simple de variabile. 19. Care sunt conversiile realizate n mod
9. Cte tipuri de directive preprocesor automat, de ctre compilator, la evaluarea
cunoastei? Exemple. unei expresii?
10. Care este modalitatea de a interzice 20. Ce este volatile?
modificarea valorii unei variabile? 21. Constante reale.
11. Ce loc ocup declararea varibilelor n 22. Ce sunt operatorii?
cadrul unui program surs scris n 23. Care din urmtoarele tipuri desemneaz
limbajul C++? date ntregi, fr semn: int, short int, char,
signed int, unsigned int, long int?
PROBLEME
24
CAPITOLUL 2 Date, operatori i expresii
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';
const x=34; int g=56; x+=h; cout<<"g="<<g<<"x="<<x<<'\n';
double y=9.8; int a=(y<<7); cout<<"a="<<a<<"y="<<y<<'\n';
int f=98789; f++; cout<<"f="<<f<<'\n';
cout<<(5++-3)--<<'\n';
cout<<('A'>'Z');
int a=9; cout<<(a!=9)<<'\n'; cout<<(++a!=9); cout<<(a++!=9);
int a=9; cout<<(a!=9)<<'\n'; cout<<(a++!=9); cout<<(++a!=9);
int a=9; cout<<(a++-2*5);
cout<<(sizeof('A')<=1)<<'\n';
cout<<(int)'A';
double x; int y=8.5; x=y%3; cout<<"x="<<x<<" y="<<y<<'\n';
double x; int y=8; x=y/3; cout<<"x="<<x<<" y="<<y<<'\n';
double w=2.5; cout<<(!w); cout<<((!w)++); cout<<(!w+2)++;
cout<<sizeof("ab9*")<<'\t'<<sizeof("a\nb");
double x=3; double y=(x<7)?1:0; cout<<y<<"\n";
int m=2, n=5, p=10; p=(m=n, n<20); cout<<"p="<<p<<'\n';
int m=2, n=3, p=5; int q=m=n=p; cout<<q<<'\n';
int x=3; double y=25.2, z; x=y; cout<<x<<'\n';
double q=35, z=q/3; cout<<z<<'\n';
int x=2; char backslash='\n'; cout<<"x="<<x<<" backslash=";
cout<<backslash<<'\n';
4. S se scrie un program care afieaz urmtoarele mesaje (inclusiv ", ', \):
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 ... bytes!
Constanta caracter 'Q' memorata pe ... octeti!
Sirul "a\n\n" este memorat pe ... octeti!
Sirul "\n" este memorat pe ... biti!
Caracterul '\' este memorat pe .... biti.
47
CAPITOLUL 2 Date, operatori i expresii
12. S se scrie un program care citete valorile a dou numere ntregi. S se calculeze i
afieze suma celor dou numere, produsul lor, ctul ntreg al mpririi numerelor i ctul
real al acestora.
13. Se tie c un an bisect este multiplu de 4, nu este multiplu de 100, dar este multiplu de
400. S se scrie o expresie care are valoarea 1 dac o valoare ntreag (introdus de la
tastatur) reprezint un an bisect, sau 0 n caz contrar.
48