Sunteți pe pagina 1din 27

CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

2. DATE, OPERATORI I EXPRESII

2.1. Programe n limbajul C/C++ 2.4. Date n limbajul C/C++


2.2. Preprocesorul 2.5. Operatori i expresii
2.3. Elemente de baz ale limbajului 2.6. Conversii ale tipului operanzilor

2.1. 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.
Program Fiiere header

Fiier surs

Funcii main Biblioteci C++

Funcii din bibliotec

Figura 2.1. Structura unui program n limbajul C


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 simpl. Uneori, ca instruciune poate apare
instruciunea nul (doar ;), sau instruciunea compus (privit ca o succesiune de instruciuni
simple, ncadrate ntre acoladele delimitatoare {}).
Autor: Diana tefnescu 23
CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

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:

Includerea fiierelor header n codul surs:


Exemplul 2.2.:
#include <stdio.h>
Cnd procesorul ntlnete aceast directiv preprocesor (identificabil datorit
simbolului #), localizeaz fiierul header indicat (parantezele unghiulare < > indic faptul
c este vorba de un fiier header sistem).
Exemplul 2.3.:
#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 (vezi exemplul 3).

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.

Asignarea de nume simbolice constantelor:


Exemplul 2.5.:
#define TRUE 1
#define FALSE 0

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. ELEMENTE DE BAZ ALE LIMBAJULUI

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

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);
Autor: Diana tefnescu 26
CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

{ } - ncadreaz instruciunile compuse;


// - Indic nceputul unui comentariu care se poate ntinde pn la sfritul liniei;
/* */ - Indic nceputul i sfritul unui comentariu pe mai multe linii;
" " - ncadreaz o constant ir (un ir de caractere);
' ' - ncadreaz o constant caracter (caracter imprimabil sau secven escape).

2.3.2. UNITILE LEXICALE

Unitile lexicale (cuvintele) limbajului C/C++ reprezint grupuri de caractere, cu o


semnificaie de sine stttoare, putnd fi:
Identificatori (simboluri neterminale);
Cuvinte cheie ale limbajului (simboluri terminale);

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.

Exemplul 2.7.: viteza, 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, clrscr, etc.), sau alei de utilizator.

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.

2.4. DATE N LIMBAJELE 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.1., 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 form 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;
Clas 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.7.

Autor: Diana tefnescu 27


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

Numele unei date


Numele unei date este un identificator i, ca urmare, trebuie s respecte regulile specifice
identificatorilor. Deasemenea, numrul de caractere componente ale 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.4.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
(un numr) 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. 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.

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

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.

Autor: Diana tefnescu 29


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

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.

2.4.2.1. Constante numerice 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
Exemplul 2.9.:
45
-78 // constante ntregi decimale (n baza 10), tip int
Constante ntregi octale - Dac n faa numrului apare cifra zero (0), acea constant
este de tip int, n baza opt (constant octal).
Exemplul 2.10.:
056
077 // constante ntregi octale, tip int
Constante ntregi hexagesimale - Dac n faa numrului apar caracterele zero (0) i x
(sau X), acea constant este de tipul int, n baza 16 (constant hexagesimal).
Reamintim cifrele folosite n baza de numeraie 16, 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.
Exemplul 2.11.:
0x45
0x3A
0Xbc // 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.
Exemplul 2.12.:
145677L
897655l // tip decimal long int
Dac secvena de cifre este urmat de U sau u, tipul constantei este unsigned int.
Exemplul 2.13.:
65555u
Dac secvena de cifre este urmat de U (u) i L (l), tipul este unsigned long int.
Exemplul 2.14: 7899UL //tip decimal unsigned long int

2.4.2.2. Constante numerice reale

Dac o constant numeric conine punctul zecimal, ea este de tipul double.


Exemplul 2.15.:
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.

Autor: Diana tefnescu 30


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

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

Exerciiul 2.1.: S se scrie urmtorul program i s se urmreasc rezultatele execuiei.


#include <iostream.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. decimal int
cout<<"Const. octala 077 are val decimala:"<<077<<\n';
cout<<"Const. hexagesimala d3 are val decimala:"<<0xd3<<\n;
cout<<"Tipul unsigned int memorat pe:";
cout<<sizeof(unsigned int)<<" octeti\n";
cout<<"Tipul unsigned int memorat pe: ";
cout<<sizeof(23U)<<" octeti\n";
cout<<"Tipul unsigned int memorat pe: ";
cout<<sizeof(23u)<<" octeti\n";
cout<<"Tipul long int memorat pe: ";
cout<<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<<"Tipul unsigned long memorat pe:";
cout<<sizeof(unsigned long int)<<" octeti\n";
cout<<"Tip unsigned long mem. pe: "<<sizeof(23UL)<<" octeti\n";
cout<<"Tip unsigned long mem. 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"; long long int d;
cout<<"Tip long long int mem. pe: "<<sizeof(d)<<" octeti\n";
cout<<"Tip short int mem.pe: "<<sizeof(short int)<<" octeti\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<<"Tipul double memorat pe: "<<sizeof(double)<<" octeti\n";
cout<<"Tipul double memorat pe: "<<sizeof(23.7)<<" octeti\n";
//23.7-const. decimala double
cout<<"Const. decim. doubla in not st.:"<<23.7e-5<<\n;
cout<<Const. PI este:<<PI<<\n;
cout<<Constanta PI este memorata pe:<<sizeof(PI)<<octeti\n:
cout<<"Tip long double mem.pe:"<<sizeof(long double)<<" oct\n";
cout<<"Tip long double mem. 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";
Autor: Diana tefnescu 31
CAPITOLUL 2 - Programarea n limbajele C/C++ 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 mem. pe "<<sizeof(011)<<" octeti\n";
cout<<"O const.oct.long mem.pe";cout<<sizeof(011L)<<" oct\n";
return 0;}

2.4.2.3. Constante caracter

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

Constante caracter corespunztoare caracterelor imprimabile


O constant caracter corespunztoare unui caracter imprimabil se reprezint prin
caracterul respectiv inclus ntre apostroafe.
Exemplul 2.19.:
Constant caracter Valoare
A 65
a 97
0 48
* 42
Excepii de la regula de mai sus le constituie caracterele imprimabile apostrof (') i
backslash (\). Caracterul backslash se reprezint prin '\\'. Caracterul apostrof se
reprezint prin '\''.

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 (tabelul 2.2. sunt prezint cteva caractere escape utilizate frecvent).
Tabelul 2.2.
Constant Valoare Denumire Utilizare
caracter Cod ASCII caracter
\n 10 LF rnd nou (Line Feed)
\t 9 HT tabulator orizontal
\r 13 CR poziioneaz cursorul n coloana 1 din rndul curent
\f 12 FF salt de pagin la imprimant (Form Feed)
\a 7 BEL activare sunet

Autor: Diana tefnescu 32


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

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.

Exerciiul 2.2.: S se scrie urmtorul program i s se urmreasc rezultatele execuiei.


#include <iostream.h>
int 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<<"Car. escape '\\n\' e mem. pe "<<sizeof('\n')<<" oct.\n";
cout<<"Caracterul '9' e 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';
return 0 ;
}

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

Exerciiul 2.3.: S se scrie urmtorul program i s se urmreasc rezultatele execuiei.


#include <iostream.h>
int main()
{cout<<"irul \"Ab9d\" e mem. pe:"<<sizeof("Ab9d")<<" oct\n";
cout<<"ir \"Abcd\\t\" mem. pe:"<<sizeof("Abcd\t")<<" oct.\n";
cout<<"irul \"\n\" este mem. pe "<<sizeof("\n")<<" octei\n";
cout<<"irul \"\\n\" este mem. pe "<<sizeof("\n")<<" octei\n";
cout<<"ir\"ABCDE\" se mem. pe "<<sizeof("ABCDE")<<" oct.\n";
return 0;}

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

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

Autor: Diana tefnescu 34


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii
ntr-un program scris 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.

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

2.4.3.2. Iniializarea variabilelor n declaraii

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

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.

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)

Autor: Diana tefnescu 35


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

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

Exemplul 2.25.:
cout << var; /* afieaz valoarea variabilei var pe monitor*/
cin >> var; /* citete valoarea variabilei var de la tasatatur */

Sunt posibile operaii multiple, de tipul:

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

Autor: Diana tefnescu 36


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

2.5. OPERATORI I EXPRESII


Datele (constante sau variabile) legate prin operatori (simboluri pentru operaii), 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. n funcie de numrul operanzilor necesari, 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.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.

Exerciiul 2.4.: S se scrie urmtorul program i s se urmreasc rezultatele execuiei.


#include <iostream.h>
int 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 (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
cout<<Val. lui c este:<<c<<\n; } //Val. lui c este: val. citit anterior
Autor: Diana tefnescu 37
CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

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 Exemple
- Minus unar -a
++ Operator de incrementare a++ sau ++a
(adun 1 la valoarea operandului)
-- Operator de decrementare a-- sau --a
(scade 1 din valoarea operandului)

Operatorul - unar schimb semnul operandului (numeric sau caracter).

Exemplul 2.30.:
int a,b; cout<<a=<<-a<<\n; b=-a;
cout<<b=<<b<<\n;

Operatorii de incrementare (++) i de 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--). Utilizarea acestor operatori n expresii, n form prefixat sau postfixat,
determin evaluarea acestora n moduri diferite, astfel:

y = ++x este echivalent cu: x = x+1; y = x;


y = x++ este echivalent cu: y = x; x = x+1;
y = --x este echivalent cu: x = x-1; y = x;
y = x-- este echivalent cu: y = x; x = x-1;

Exerciiul 2.5.: S se scrie urmtorul program i s se urmreasc rezultatele execuiei.


#include <iostream.h>
int main()
{ int a=9; cout<<a++=<<a++<<\n; //Afiare: a++=9
cout<<a=<<a<<\n; //Afiare: a=10
a=9; //Revenire n situaia anterioar
cout<<++a=<<++a<<\n; //Afiare: ++a=10
cout<<a=<<a<<\n; //Afiare: a=10
a=9; cout<<a--=<<a--<<\n; //Afiare: a--=9
cout<<a=<<a<<\n; //Afiare: a=8
a=9; //Revenire n situaia anterioar
cout<<--a=<<--a<<\n; //Afiare: --a=8
cout<<a=<<a<<\n; //Afiare: a=8
int z,x=3; z=x++-2;
cout<<z=<<z<<\n; //Afiare: z=1
cout<<"x=<<x<<\n; //Afiare: x=4
x=3; z=++x-2; cout<<z=<<z<<\n; //Afiare: z=2
cout<<"x=<<x<<\n; //Afiare: x=4
return 0 ;
}

Autor: Diana tefnescu 38


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

Operatori aritmetici binari simpli:


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

Operatorii prezentai respect o serie de reguli de preceden (prioritate) i asociativitate


(ordinea de grupare ntr-o secven n care apar mai muli operatori cu aceeai preceden),
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 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

Exerciiul 2.6.: S se scrie urmtorul program i s se urmreasc rezultatele execuiei


acestuia.
#include <iostream.h>
int main()
{ int rezult, a=20,b=2,c=25,d=4; rezult=a-b;
cout<<a-b=<<rezult<<\n; // Afiare: a-b=18
rezult=a+b; cout<<a+b=<<rezult<<\n;// Afiare: a+b=22
rezult=a*b;cout<<c*b=<<rezult<<\n; // Afiare: c*b=50
rezult=a/d; cout<<a/d=<<rezult<<\n;// Afiare: a/d=5
rezult=c%b; cout<<c%b=<<rezult<<\n;// Afiare: c%b=1
rezult=c/b*d; cout<<c/b*d=<<rezult<<\n; // Afiare: c/b*d=48
rezult= -b+a; cout<<-b+a=<<rezult<<\n; // Afiare: -b+a=18
rezult= -(b+a); cout<<-(b+a)=<<rezult<<\n;// Afiare: -(b+a)=-22
rezult=b+c*d;cout<<b+c*d=<<rezult<<\n; // Afiare: b+c*d=102
rezult=(b+c)*d;cout<<(b+c)*d=<<rezult<<\n; //(b+c)*d=108
a = b = c = 20; cout<<"c="<<c<<"b="<<b<<"a="<<a<<'\n';
// Atribuire multipl c=20 b=c a=b c=20 b=20 a=20
a = b = c = 12*13/4; cout<<"c="<<c<<"b="<<b<<"a="<<a<<'\n';
// Atribuire multipl c=36 b=c a=b
return 0;
}

Autor: Diana tefnescu 39


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

Operatori aritmetici binari compui


Operator Semnificaie Exemple
+= a=a+b a+=b
-= a=a-b a-=b
*= a=a*b a*=b
/= a=a/b a/=b
%= a=a%b a%=b

Aceti operatori se obin prin combinarea operatorilor aritmetici binari cu operatorul de


atribuire i sunt folosii sub forma urmtoare:
<expresie1> <operator> = <expresie2>;
Rezultatul obinut este acelai cu rezultatul obinut prin:
<expresie1> = <expresie1> <operator> <expresie2>;

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.

Exerciiul 2.7.: S se scrie urmtorul program i s se urmreasc rezultatele execuiei.


#include <iostream.h>
int main()
{ int a,b; float c=9.3; a=3; b=8;
cout<<a=<<a<<\n; //Afiare a=3
a+=b; cout<<a=<<a<<\n; //Afiare a=11
a=3; b=8;a-=b; cout<<a=<<a<<\n; //Afiare a=-5
a=3; b=8;a*=b; cout<<a=<<a<<\n; //Afiare a=24
a=3; b=8;a/=b; cout<<a=<<a<<\n; //Afiare a=0
a=3; b=8;a%=b; cout<<a=<<a<<\n; } //Afisare 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 cu a<=b
> Mai mare dect a>b
>= Mai mare sau egal cu a>=b

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.

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

Autor: Diana tefnescu 40


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

Exerciiul 2.8.: S se scrie urmtorul program i s se urmreasc rezultatele execuiei.


#include <iostream.h>
int 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)
rezult=a<=b;
//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;
/* Op. + are prioritate mai mare dect operatorul >= . Afiare: a+10>=lim=0 */
rezult=a+(10>=lim); cout<<a+(10>=lim)=<<rezult<<\n;
/*Schimbarea prioritii op. 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;} //Echiv. cu (5>b)>10Afiare: 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 (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.

Expresia <expresie1>||<expresie2> are valoarea diferit de 0 dac FIE expresie1, FIE


expresie2 au valori diferite de zero.

Expresia <expresie1>&&<expresie2> are valoarea diferit de 0 dac AMBELE


expresii-operand ( expresie1 i expresie2) au valori diferite de zero.

Autor: Diana tefnescu 41


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

Exerciiul 2.9.: S se scrie urmtorul program i s se urmreasc rezultatele execuiei.


#include <iostream.h>
int 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;// a||b=1(sau val. nenul)
rezult=!a;cout<<!a=<<rezult<<\n; // !a=1 (sau valoare nenul)
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 nenul)
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 nenul)
rezult=d||b&&a;cout<<d||b&&a=<<rezult<<\n;//Afiare d||b&&a =1
}// n evaluarea expresiilor, s-au aplicat prioritile operatorilor

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

Operatori logici pe bit (simpli sau compui)


Operator Semnificaie Exemple
~ Negaie (cod complementar fa de unu) ~a
& AND (Conjuncie, i logic pe bit a&0377
| OR (Disjuncie, sau logic pe bit) a|0377
^ XOR (Sau exclusiv logic pe bit) a^b
<< Deplasare stnga cu un numr indicat de poziii 0377<<2
>> Deplasare dreapta cu un numr indicat de poziii 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, 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

Operatorul ~ are aceeai prioritate ca operatorii aritmetici 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.

Autor: Diana tefnescu 42


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii
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).

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.

Autor: Diana tefnescu 43


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii

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.

Exemplul 2.36.: 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.

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

Autor: Diana tefnescu 44


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii
Tabelul 2.6.
Nr. Clas de operatori Operatori Asociativitate
1. Primari () [] . -> :: de la stnga la dreapta
2. Unari ! ~ ++ -- sizeof (tip) de la dreapta la stnga
-(unar) *(defereniere) &(refereniere)
3. Multiplicativi * / % de la stnga la dreapta
4. Aditivi + - de la stnga la dreapta
5. Deplasare pe bit << >> de la stnga la dreapta
6. Relaionali < <= > >= de la stnga la dreapta
7. De egalitate == != de la stnga la dreapta
8. Operatori logici & (I logic pe bit) de la stnga la dreapta
9. ^ (XOR pe bit) de la stnga la dreapta
10. | (SAU logic pe bit) de la stnga la dreapta
11. && de la stnga la dreapta
12. || de la stnga la dreapta
13. Condiional ?: de la dreapta la stnga
14. De atribuire, aritm. = += -= *= %= de la dreapta la stnga
compui, logici pe &= ^= |= <<= >>=
bit compui
15. Virgul , de la stnga la dreapta

Operatorii de indexare [ ]
Operatorii de indexare sunt parantezele ptrate [ ]. Acestea ncadreaz expresii
ntregi care reprezint indici ntr-un tablou (vector, matrice, etc.).

Operatorii de acces la membri structurilor


Operatorii ::, ., ->, .* i ->* permit accesul la componentele unei structuri (a unei
date compuse, cu mai multe elemente). Ei vor fi studiai n capitolul 7.

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.

2.6. CONVERSII ALE TIPULUI OPERANZILOR


La evaluarea expresiilor, n anumite situaii, se realizeaz conversii ale tipului operanzilor.
Aceste conversiile pot fi:
Automate;
Cerute de evaluarea expresiilor;
Cerute de programator (prin construciile cast), explicite.

Autor: Diana tefnescu 45


CAPITOLUL 2 - Programarea n limbajele C/C++ Date, operatori i expresii
Conversiile automate sunt realizate de ctre compilator, de fiecare dat cnd ntr-o
expresie apar operanzi de tipul char sau short int:
char, short int -> 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 (de tip int sau char) este convertit la
acelai tip; tipul expresiei este long int.
Dac un operand este de tipul double, cellalt (de tip int, char sau float) este
convertit la acelai tip; tipul expresiei este double.
Dac un operand este de tipul float, cellalt (de tip int sau char) este convertit la
acelai tip; tipul expresiei este float.

Conversiile explicite (cerute de programator) se realizeaz cu ajutorul construciilor cast.

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

2.7. NTREBRI I PROBLEME

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?

Autor: Diana tefnescu 46


CAPITOLUL 2 Date, operatori i expresii
24. Operatori aritmetici binari compui. 34. Ce semnific parantezele unghiulare < >
25. Operatorul de refereniere. care ncadreaz numele unui fiier
26. Operatori relaionali binari. header?
27. Ce sunt literalii? 35. Ce conin fiierele header?
28. Diferene ntre operatorii logici pe bit i 36. Care sunt calificatorii folosii alturi de
operatorii logici pe cuvnt. tipurile de baz pentru obinerea tipurilor
29. Cum explicai c operatorii aplicabili derivate de date?
datelor ntregi se pot folosi i pentru 37. De ctre cine este dat tipul unei expresii?
datele de tip caracter? 38. Operatorul virgul
30. Care sunt modalitile de realizare a 39. Constante ir de caractere.
operaiilor de intrare/ieire n limbajul C? 40. Ce operatori ternari cunoastei?
Dar n C++? 41. Care dintre urmtorii operatori pot fi
31. Care este tipul rezultatului unei operaii aplicai datelor numerice reale? & (de
de atribuire? refereniere), %, +, -, *, /, <<, | ?
32. Cum sunt reprezentate intern datele de tip 42. Care dintre identificatorii urmtori sunt
char? incoreci? acceleraie gravitaional,
33. Cum se memoreaz un o dat ir de acceleraie, acceleraie_gravitaional,
caractere? Acceleraie_gravitaional, 9acceleraie
43. Constante caracter.

PROBLEME

1. S se scrie declaraiile necesare pentru definirea constantelor simbolice: pi, g (acceleraia


gravitaional), unghi_drept, dimensiune_MAX
2. Care dintre cuvintele de mai jos sunt cuvinte cheie (rezervate) i care sunt identificatori
definii de programator? char, INT, long, Float, Int
3. Care dintre identificatorii urmtori sunt coreci i care nu? Punctul#1, ZI_LUNA, anul
nasterii, anul angajarii, 3_copii, _zi, _4nume, bin-2, w, Aria Dreptunghiului
4. Care va fi rezultatul afiat pe ecran n urma execuiei urmtoarelor secvene:
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;
3. S se verifice corectitudinea urmtoarelor secvene. Pentru cele incorecte, explicai sursa
erorilor. Pentru cele corecte, specificai rezultatul.
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;
int a=9; cout<<&(a+8)<<'\n';
int I=8; cout<<(I+10)++<<'\n';
double a=8.7; A=(a+8)/56; cout<<A<<'\n';

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.

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. Care dintre urmtoarele declaraii sunt incorecte, i de ce?


int lungime cerc, arie, 2latime;
double greutate=9,34;
long d=8.78; long double;
7. Ce operaie logic i ce masc trebuie s folosii pentru a converti codurile ASCII ale
literelor mici n litere mari? Dar pentru conversia invers?
8. O deplasare la dreapta cu 3 bii este echivalent cu o rotaie la stnga cu ci bii?
9. S se seteze pe 1 toi biii dintr-un octet, cu excepia bitului cel mai semnificativ.
10. 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.
11. S se citeasca dou valori ntregi. S se calculeze i s se afieze restul mpririi celor
dou numere.

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

S-ar putea să vă placă și