Sunteți pe pagina 1din 21

Elemente de bază ale limbajului C++

1. SETUL DE CARACTERE

Entităţile sintactice specifice limbajului C se construiesc din simbolurile care constituie alfabetul
limbajului C. Simbolurile se codifica conform codului ASCII ( American Standard Code for Information
Interchange ), prin cate o configuratie de 8 biti ( un octet); rezulta faptul ca sunt 256 ( 0 - 255 ) de
caractere in codul ASCII.

Alfabetul cuprinde simboluri grafice si simboluri fara corespondent grafic:

Simboluri grafice

Cod ASCII
Categorie Membri in zecimal in hexazecimal in
octal
A B C ..... Z A -- 65 41 101
Z -- 90 5A 132
Litere a -- 97 61 141
a b c ...... z z -- 122 7A 172
0 -- 48 30 060
Cifre 0 1 2 ...... 9
9 -- 57 39 070
Liniuta de _ 95 5F 137
subliniere
! " # % & ' ( ) * + , - .
Operatori si /
semne : ; < = > ? [ ] \ ^ { } |
de punctuatie ~

Simboluri fara corespondent grafic

Cod
Secventa
Simbol Semnificatie ASCII
escape
in zecimal
SP avans cursor cu o pozitie - space 32
BEL semnal acustic - bell \a 7
BS revenire cursor cu o pozitie - back space \b 8
FF salt la pagina noua - form feed \f 12
NL avans cursor cu o linie - new line \n 10
revenire cursor la inceputul liniei curente-carriage
CR \r 13
return
salt la urm pozitie de tabulare orizontala -horizontal
HT \t 9
tab
VT salt la urm pozitie de tabulare verticala -vertical tab \v 11
NULL caracter cu cod 0 ( terminator de sir ) \0 0

1
Astfel, mulţimea caracterelor se împarte în trei grupe:
 caractere negrafice: cod Ascii < 32 şi DEL(cod 127 - excepţie)
- au diferite funcţii speciale, spre exemplu: \n, \t, \b, etc
 spaţiu cod Ascii = 32
 caractere grafice (imprimabile) 32<cod Ascii <127
- literele mari ale alfabetului englez (A cod 65)
- literele mici ale alfabetului englez (a cod 97)
- cifre 0..9 (0 cod 48)
- caractere speciale: !, ", *. + etc.
-
OBS. Limbajul C este case-sensitive, în el se face distincţie între literele mari şi literele mici!

2 ENTITĂŢILE SINTACTICE

Entităţile sintactice de bază utilizate în redactarea unui program şe înscriu în următoarele


categorii:

2.1 CUVINTE CHEIE şi CUVINTE REZERVATE


2.2. IDENTIFICATORI
2.3. CONSTANTE
2.4. OPERATORI
2.5. SEPARATORI (DELIMITATORI)
2.6. COMENTARII

2.1. Cuvintele cheie şi cuvintele rezervate sunt cuvinte utilizate în principal pentru declaraţii de
tipuri de date şi instrucţiuni. Toate aceste cuvinte sunt scrise cu litere mici.

EXEMPLU: Tabela cuvintelor cheie - 32 cuvinte cheie, dintre care 27 provin din standardul initial
Kernighan - Ritchie, iar 5 au fost adaugate de comitetul ANSI ( enum, const, signed, void, volatile );
limbajele de nivel inalt au de obicei mult mai multe cuvinte cheie - BASIC peste 100

auto double int struct


break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while

Tabela cuvintelor rezervate - proprii compilatorului Turbo C: nume de registri, moduri de compilare

asm _cs _BH _DH


cdecl _ds _BL _DI

2
far _es _BP _DL
huge _ss _BX _DX
interrupt _AH _CH _FLAGS
near _AL _CL _SI
pascal _AX _CX _SP

2.2. Identificatori

Un identificator este o succesiune de litere (mari sau mici ale alfabetului englez), cifre sau
caracterul special ‘_’; primul caracter este obligatoriu noncifră.
Exemplui:

 nume de variabile, constante simbolice, functii, tipuri, structuri, uniuni ( care sunt nume
utilizator ):.
 cuvinte cheie şi rezervate ale limbajului C - pot fi folosite doar cu intelesul cu care au fost
definite

Exemple:

- constante simbolice

#define PI 3.1415
#define DIMENSIUNE 20
#define Salut "Hello!"

- nume utilizator: Max, _min, distincte, frecv, Max2


- NU reprezintă identificatori: 2min, 67prim, 7_org, A+B, a& ,  max,  4ORD

2.3. Constante (literali)

a) Constantele numerice pot avea în componenţă cifre şi/sau caracterele . + - E e


- Constantele nu au semn explicit: De exemplu +12 sau -12 sunt expresii formate din cate o
constanta precedata de operatorii unari +, respectiv -.

- Ocupa un spaţiu de memorie minim, corespunzător tipului numeric căruia îi aparţin.

- Constantele numerice pot fi:

 întregi –
o zecimale - în baza 10;
o octale - în baza 8; sunt precedate de 0 exemplu: 0237 ( în octal );
o hexazecimale - în baza 16; sunt precedate de 0x sau 0X; exemple: 0xffab
 reale – reprezintă valori raţionale în scriere zecimală sau exponenţială. De exemplu o
constantă în patru scrieri echivalente:

12.345 .12345E+2 1.2345e1 12345e-3

3
b) Constantele caracter se precizează între apostrofuri: ‘a’, ‘1’.Caracterul poate fi:

 un simbol grafic sau codul său ASCII scris în zecimal, sau hexazecimal, respectiv octal, prin
utilizarea simbolului \; exemple: 'A' '\x41' '\101' ( sunt echivalente );
o caracterele \ ' " se reprezintă ca şi constante: '\\' '\'' '"'
 un simbol fără echivalent grafic, dat ca secvenţă escape: '\n' '\xa' '\12' ( sunt
echivalente ).
 caractere cu coduri în [128, 255] se pot afişa prin intermediul secvenţelor escape ‘\xdd’
unde dd reprezintă scrierea în baza 16 a codului

Exemplu: Desenarea unui dreptunghi.

#include <iostream>
using namespace std;

int main()
{
unsigned char a='\xc9', b='\xcd',
c='\xbb', d='\xc8', e='\xbc',
f='\xba', g='\x01';
cout<<a<<b<<b<<b<<c<<endl;
cout<<f<<' '<<g<<' '<<f<<endl;
cout<<d<<b<<b<<b<<e;
return 0;
}

Pentru a atribui un nume unei constante putem scrie:

const [tip] nume=valoare;

exemplu>

const float pi=3.14;


const int n=7;
const x=5; //implicit tip int

c) Constantele şir de caractere se precizează între ghilimele. Fiecare caracter din şir poate fi un
simbol grafic, o secvenţă escape sau un cod ASCII ( în octal sau hexazecimal ). Spaţiul ocupat este
un număr de octeţi cu unu mai mare decât al caracterelor din sir, ultimul octet fiind rezervat
pentru terminatorul de sir: caracterul cu codul ASCII 0, adică '\0'. Dacă se doreşte ca şi caracterul
" să facă parte din şir, el trebuie precedat de \.

Exemple: "CURS" "\x43URS" ( scrieri echivalente ale unui şir ce ocupă 5 octeţi );
"1a24\t" "\x31\x61\x32\x34\11" ( scrieri echivalente ale unui şir ce ocupă 6 octeţi )
"'\"" ( şirul ’” ce conţine caracterele ' " şi terminatorul, deci ocupă 3 octeţi ).

4
Tabelul ASCII

5
Tabelul ASCII-extins

6
2.4. Operatori sunt simboluri utilizate pentru a specifica operaţiile de efectuat. O combinaţie validă
de valori (variabile sau constante) şi operatori formează o expresie.

2.5. Separatorii (delimitatori) sunt simboluri ce separă diverse entităţi:

- spaţiile (unul sau mai multe)


- CR (poziţionează cursorul în coloana 1, pe rândul curent al ecranului)
- NL (’\n’)
-;
-{ }
2.6. Comentariile sunt texte care pot fi introduse in programul sursa, dar nu sunt luate in
consideratie de compilator si deci nu au efect in timpul executarii programului. Comentariile sunt utile
pentru o mai buna intelegere a programului de catre om.
In programele C++, se pot folosi doua feluri de comentarii:
a) comentarii care se pot extinde pe una sau mai multe linii si au forma
/* ana are multe
teme si
proiecte de facut*/
b) comentarii de sfarsit de linie, care incep cu simbolul // si continua pana la sfarsitul liniei
respective, deci au forma
//ana are mere

3 TIPURI DE DATE

Un tip de dată reprezintă:


- o mulţime de valorilor
- o mulţime de operaţii definite pe mulţimea valorilor

CLASIFICARE:
1. tipuri predefinite de date (standard sau fundamentale)
 aritmetice (întregi şi reale)
 void (niciun tip)
2. tipuri derivate
 tipuri structurate
- tablouri (şiruri de caractere)
- înregistrare
- fişier text
 pointer
 referinţă, sinonim
 definite de utilizator (enumerare)

7
Tipurile simple de date (predefinite sau standard) uzuale pt. Codeblocks şi MinGW.

CUVÂNT REZERVAT LUNGIME limite


ÎN BIŢI
char 8 întreg cu semn [-27,27-1 ]
min= -128
max= 127
nr octeti: 1
unsigned char 8 întreg fără semn [0,28-1 ]
min= 0
max= 255
nr octeti: 1
int 32 întreg cu semn [-231,231-1 ]
min= -2147483648
max= 2147483647
nr octeti: 4
unsigned int 32 întreg fără semn [0,232-1 ]
sau min= 0
unsigned max= 4294967295
nr octeti: 4
long 32 întreg cu semn [-231,231-1 ]
min= -2147483648
max= 2147483647
nr octeti: 4
unsigned long 32 întreg fără semn [0,232-1 ]
min= 0
max= 4294967295
nr octeti: 4
long long 64 întreg cu semn [-263,263-1]
min= -9223372036854775808
max= 9223372036854775807
nr octeti: 8
unsigned long long 64 întreg fără semn [0,264-1 ]
min= 0
max= 18446744073709551615
nr octeti: 8
bool 8 min= 0 true
max= 1 false
nr octeti: 1
float 32 real cu val absolută în intervalul [3.4*10-38,
3.4*1038]
min= 1.17549e-38
max= 3.40282e+38
nr octeti: 4
simplă precizie (6 )
double 64 real cu val absolută în intervalul [1.7*10 -308,
1.7*10308]
min= 2.22507e-308
max= 1.79769e+308
nr octeti: 8
dublă precizie (10 )
long double 82 real cu val absolută în intervalul [3.4*10 -4932,
3.4*104932]

8
4. Variabile
 identificatori (nume) cărora li se asociază la un moment dat o adresă şi o valoare, şi care sunt
supuse prelucrării în programul care le conţine
 reprezintă un ansamblu de 4 elemente: nume / tip / adresă de memorie / valoare
 se declară prin intermediul instrucţiunilor de declarare:
<tip> nume [=val];
Exemplu: float a,b;
char a[20], x;
int a=5;
char s[]=”ora” ;
 nu există tipuri de variabile predefinite
 înainte de a fi utilizate, variabilele trebuie declarate pentru a specifica tipul şi numele lor şi pentru
a li se rezerva spaţiul de memorie
 variabilele pot fi de:
o tip întreg (char, int, long long)
o tip real (float, double, long double),
o tipuri structurate (vectori, matrice, şiruri de caractere, înregistrare)
o pointeri
 pentru a avea acces la zona de memorie alocată unei variabile, folosim operatorul de adresă &
exemplu. int v=10; cout<<&p;
 iniţializarea unei variabile se face prin citire sau atribuire simplă:
Exemplu: int x=3, y,z;
cin>>y; z=x+y+z;

5. Operatori
1. Operatorul sizeof
2. Operatorul de determinare a adresei &
3. Operatorii aritmetici
a. operatorii unari de păstrare/schimbare a semnului: + -
b. operatorii binari multiplicativi - de înmulţire, împărţire, modulo: * / %
c. operatorii binari aditivi - de adunare şi scădere: + -
4. Operatorii de atribuire =
5. Operatorii pe biti
~ complementare & si
>> deplasare la dreapta ^ sau exclusiv
<< deplasare la stanga | sau
6. Operatorii de atribuire aritmetică (compusă)

+= -= *= /= %= &= |= ^= <<= >>=

7. Operatori de incrementare ++ /decrementare --


8. Operatorii relationali < <= > >=
9. Operatori de egalitate == !=
10. Operatorii logici && || !
11. Conversii de tip. Operatorul cast
12. Operatorul conditional ?
13. Operatorul virgula (secvential)

9
1. Operatorul sizeof

Rezultatul aplicării acestui operator unar este un număr natural reprezenând numărul de octeti
necesari pentru stocarea unei valori de tipul operandului acestui operator.

Sintaxa: sizeof (tip)


sizeof (expresie)

#include <iostream>
using namespace std;
int main()
{
cout<<sizeof('a')<<endl ;
cout<<sizeof(int)<<endl;
cout<<sizeof(2.5 + 3)<<endl;
cout<<sizeof(float)<<endl;
cout<<sizeof(double)<<endl;
cout<<sizeof(long double);
return 0;
}

2. Operatorul de determinare a adresei &

Este un operator unar, operandul fiind o variabilă (obligatoriu!!). Se poate afla adresa zonei de
memorie repartizate unei variabile folosind acest operator.

Exemplu:
int v=2011;
cout<<"valoare: "<<v<<endl<<"adresa de memorie: "<<&v;

3. Operatorii aritmetici

a. operatorii unari: + -
b. operatorii binari multiplicativi - de înmulţire, împărţire, modulo: * / %
c. operatorii binari aditivi: + -

10
Obs:
– Rezultatul evaluării expresiei aritmetice 10/3 este 3, adică câtul împărţirii întregi
ale celor doi operanzi întregi.
– 10./ 3 = 3.33333
– Operatorul % se aplică doar datelor de tip întreg.

4. Operatorii de atribuire =

variabilă=expresie;

sau var1=var2=varn=expresie; (atribuire multiplă)

Obs. Nu este permisă o atribuire multiplă de forma:

int a,b,c;
a=b=7=c=2;

5. Operatorii la nivel de biţi:

- datele sunt reprezentate în memoria internă în formă binară.


- acţionează pe reprezentarea binară a datelor de tip întreg, cu sau fără semn.
- nu pot fi aplicaţi numerelor reale (raţionale)
- acţionează asupra biţilor individuali (numerotaţi de la dreapta la stânga, începând cu 0)
- rolul lor: posibilitatea de a manevra biţii cu ajutorul operatorilor la nivel de bit

& si logic la nivel de bit


| sau logic la nivel de bit
^ sau exclusiv la nivel de bit
~ complementare la nivel de bit
>> deplasare la dreapta a reprezentării binare
<< deplasare la stanga a reprezentării binare

 Operatorul & logic la nivel de bit

- Operanzii trebuie să fie de acelaşi tip (caracter sau întreg).

- & 0 1
0 0 0
1 0 1

- Este folosit pentru a verifica dacă un bit este setat (are valoarea) 1 sau 0. În acest scop, efectuăm o
operaţie între variabila al cărui conţinut vrem să-l testăm şi o constantă hexazecimală care are un
singur bit 1, în poziţia ce urmează a fi testată.

bit poziţia n .......... bit poziţia 2 bit poziţia 1 bit poziţia 0

11
Exemplu: testez bitul 4 din variabila a de tip char cu conţinutul 0101 1011= 0x5B, adică 91 în baza
10. Folosesc variabila b=0001 0000=0x10

a&b= 0101 1011 &


0001 0000
-----------------
0001 0000 = b => bitul 4 este setat pe 1.

Pentru char c=0x04 obţinem:

a&b= 0101 1011 &


0000 0100
-----------------
0000 0000 = 0 => bitul 2 este setat pe 0.

#include <iostream>
using namespace std;

int main()
{ char a=0x5B, b=0x10, c=0x04;
cout<<"a= "<<a<<" caracter cu codul: "<<(int)a<<endl;
cout<<"b= "<<b<<" caracter cu codul: "<<(int)b<<endl;
cout<<"a&b="<<(a&b)<<endl;
if(a&b!=0) cout<<"bit 4 setat pe 1";
else cout<<"bit 4 setat pe 0";
if(a&c) cout<<"\nbit 2 setat pe 1";
else cout<<"\nbit 2 setat pe 0";
return 0;
}

 Operatorul I sau logic la nivel de bit

- Operanzii trebuie să fie de acelaşi tip (caracter sau întreg).

| 0 1
0 0 1
1 1 1

12
Exemplu: Fie variabila a de tip unsigned char cu conţinutul 0101 1011= 0x5B, adică 91 în baza 10.
Fie variabila x=1101 0001=0xD1 = 209 de tip unsigned char.

a|x = 0101 1011 | unsigned char a=0x5B, x=0xd1;


1101 0001 cout<<(int)x<<endl;
----------------- cout<<"a|x="<<a|x<<' ';
1101 1011 => 0xDB= 219

 Operatorul ^ sau exclusiv la nivel de bit

- Operanzii trebuie să fie de acelaşi tip (caracter sau întreg).

- Este folosit pentru a schimba setarea unui bit. (0=>1 , respectiv 1=>0)

^ 0 1
0 0 1
1 1 0

Exemplu: Schimb setarea bitului 4 din variabila a de tip char cu conţinutul 0101 1011= 0x5B, adică
91 în baza 10. Folosesc variabila b=0001 0000=0x10

a&b= 0101 1011 ^


0001 0000
-----------------
0100 1011
OBS. (a^b)^b==a (revenire la setarea iniţială

Aplicaţie. Se citeşte un număr natural n. Să se afişeze reprezentarea binară

 Operatorii >> si << pentru deplasarea reprezentării binare la dreapta/stanga a unei


variabile/valori de tip întreg

În cazul operatorilor de deplasare, care sunt binari, primul operand este cel ai cărui biţi sunt
deplasaţi, iar al doilea indică numărul de biţi cu care se face deplasarea - deci numai primul operand
este prelucrat la nivel de bit:
a<<n // deplasare la stânga a reprezentării binare cu n poziţi
a>>n // deplasare la dreapta a reprezentării binare cu n poziţi
La deplasarea la stânga cu o poziţie, bitul cel mai semnificativ se pierde, iar în dreapta se
completează cu bitul 0.
La deplasarea la dreapta cu o poziţie, bitul cel mai puţin semnificativ se pierde, iar în stânga se
completează cu un bit identic cu cel de semn (primul bit).

Obs. Cu excepţia cazurilor când se produce depăşire, deplasarea la stânga cu n biţi echivalează cu
înmulţirea cu 2 la puterea n.
Analog, deplasarea la dreapta cu n biţi echivalează cu împărţirea cu 2 la puterea n.

13
Exemple:

 Cele doua secvente din tabela conduc la aceleasi rezultate pentru variabila i de tip int:

i=i*8; i=i<<3;
i=i/4; i=i>>2;
i=i*10; i=i<<3 + i<<1;

 În tabela următoare apar valorile obţinute (în binar şi zecimal) prin aplicarea operatorilor de
deplasare pentru variabila a de tip char:

a a<<1 a<<2 a>>1 a<<2


00000001 00000010 00000100 00000000 00000000
1 2 4 0 0
00001110 00011100 00111000 00000111 00000011
14 28 56 7 3
11111111 11111110 11111100 11111111 11111111
-1 -2 -4 -1 -1
11011101 10111010 01110100 11101110 11110111
-35 -70 116(depasire) -18 -9

 Exemplul 1: Afişarea reprezentării binale a unui număr natural x care poate fi reprezentat pe 4
octeţi. ( bitul cel mai puţin semnificativ se consideră ca fiind de poziţie 0, biţii sunt numerotaţi
de la 0 la 31, bitul 31 este bitul de semn setat pe 1 în acest caz).

#include <iostream>
using namespace std;

int main()
{
int x, bit=1, i;
cout<<" x>=0: "; cin>>x;
bit=bit<<30; // bitul 1 este pe pozitia 30
for(i=1;i<=31;i++)
{ if((x & bit)!=0)cout<<1;
else cout <<0;
bit= bit>>1;
}
return 0;
}

14
 Exemplul 2. Să se genereze toate submulţimile mulţimii {1,2,3,…,n} unde 1<=n<=63, n
număr natural.

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
long long x, bit, max=0;
int i,n;
cout<<"n<60 n= "; cin>>n;
//formez in max cel mai mare numar natural care poate fi reprezentat
//pe n pozitii binare, 0<=n<63
max =pow(2.0,n)-1;
//cout<<max<<endl;
bit=1; // bitul 1 este pe pozitia 30
for(x=0;x<=max;x++)
{ bit=1; cout<<"{";
for(i=0;i<=n;i++)
{ if((x & bit)!=0)cout<<i+1<<' ';
bit= bit<<1;
}
cout<<"}\n";
}
cout<<"numar total de submultimi(2^n)= "<<max+1;
return 0;
}

15
5. Operatorii de atribuire aritmetică (compusă)

Permit o scriere mai compactă a atribuirilor de forma:


variabila = variabila op expresie;
prin
variabila op = expresie;

operaţia: forma echivalenta:


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; (int a,b;)
a=a&b; a&=b; (tip intreg, la nivel de bit)
a=a|b; a|=b; (tip intreg, la nivel de bit)
a=a^b; a^=b; (tip intreg, la nivel de bit)
a=a>>b; a>>=b; (tip intreg, la nivel de bit)
a=a<<b; a<<=b; (tip intreg, la nivel de bit)

6. Operatori de incrementare ++ /decrementare --

Pot fi utilizati ca operatori prefixaţi sau postfixaţi:


++variabila //valoarea variabilei creşte cu 1
variabila++ //valoarea variabilei creşte cu 1
--variabila //valoarea variabilei scade cu 1
variabila-- //valoarea variabilei scade cu 1

 dacă este prefixat (adică este pus în faţa numelui variabilei) atunci mai întâi se modifică
valoarea variabilei şi apoi se foloseşte noua valoare.

Exemplu: int a=10; cout<<--a; cout<<" "<<a;

// se va afişa valoarea 9

este echivalentă cu: int a=10; a=a-1; cout<<a;

 dacă este postfixat (adică este pus după numele variabilei) atunci mai se foloseşte
valoarea curentă a variabilei şi apoi se modifică valoarea variabilei.

Exemplu: int a=10; cout<<a++; cout<<" "<<a;

// se va afişa valoarea 10 11

este echivalentă cu: int a=10; cout<<a; a=a+1; cout<<" "<<a;

Exemplu: int i=3,j=9,k;


k=++i+j--;
cout<<i<<" "<<j<<" "<<k; // 4 8 13
16
i j k int i=3,j=9,k;
3 9 i=i+1; k=i+j; j=j-1;
cout<<i<<" "<<j<<" "<<k;
4 8 4+9=13

7. Operatorii relationali: < <= > >=

Operatorii relaţionali sunt binari şi apar în expresii logice (condiţii logice), valorile acestora fiind
logice: 0 ( interpretat ca valoarea logică fals)- sau 1 ( interpretat ca valoarea logica adevărat ). În
C orice valoare diferită de 0 este interpretată ca adevărat.

8. Operatori de egalitate == !=

Expresiile în care intervin aceşti operatorii returnează 0 sau 1, dacă se realizează egalitatea
sau nu.

exemplu: 2==2 => rezultat 1


2==7 => rezultat 0
4!=4 => rezultat 0
3!=1 => rezultat 1

9. Operatorii logici && || !

! negatie logica
&& si logic
|| sau logic

 Operanzii sunt întregi, interpretaţi ca valori logice. Operatorii tratează operanzii ca valori logice,
deci orice valoarea diferită de 0 este interpretată ca adevărat, iar 0 ca fals.

x y !x x&&y x||y
0 0 1 0 0
0 valoare≠0 1 0 1
valoare≠0 0 0 0 1
valoare≠0 valoare≠0 0 1 1

 dacă primul operand al expresiei în care apare operatorul && este 0, sigur rezultatul final este 0,
indiferent de valoarea celui de-al doilea
 dacă primul operand al expresiei în care apare operatorul || este ≠0, sigur rezultatul final este 1,
indiferent de valoarea celui de-al doilea.

Expresiile logice în C se calculează în „scurt circuit”, adică dacă primul operand are valorile de mai
sus, corespunzator operandului && sau ||, cel de-al doilea operand nu se mai evaluează. Aceasta
implică necesitatea codificării cu atentie a expresiilor logice, trebuind să se tina cont şi de efectele
laterale.

17
Exemplu:

#include <iostream>
using namespace std;

int main()
{
int a=4,b=6;
cout<<"a= "<<a<<" b= "<<b<<endl;
cout<<"!a "<<!a;
cout<<endl<<"!!a "<<!!a;
cout<<endl<<"a&&b-6 "<< (a&&b-6); // se executa mai intai b-6, apoi a&&0
cout<<endl<<"a||(b+=8) "<< (a||(b+=8)); //a e diferit de 0=> expresia
//este adevarata. b nu se modifica
cout<<endl<<"a= "<<a<<" b= "<<b;
return 0;
}

10. Conversii de tip. Operatorul cast

La evaluarea expresiilor pot apare conversii implicite:


 în instrucţiunea variabila=expresie; se evaluează prima dată expresia, fără a ţine cont de
tipul variabilei; dacă tipul rezultatului obţinut este diferit de cel al variabilei, se realizează conversia
implicită la tipul variabilei. Exemplu: float r=5.2; int x; x=r;//x=5
 La evaluarea unei expresii cu 2 operanzi, se realizează conversiile implicite următoare (de
la tipul mai “mic” la cel mai “mare”):
o dacă un operand este de tip char sau unsigned char atunci se converteşte către int
o dacă un operand este de tip char sau unsigned char atunci se converteşte către int
o dacă în expresie un operand este de tip long double, atunci şi ceilalţi se convertesc la
long double
o dacă în expresie un operand este de tip double, atunci şi ceilalţi se convertesc la long
double
o dacă în expresie un operand este de tip long , atunci şi ceilalţi se convertesc la long
double
o dacă cei doi operanzi sunt de tip caracter atunci rezultatul va fi de tip int.

18
 Exemplu int char x='a', y=1;
cout<<x+y; //98
cout<<(char)(x+y); //b

 Operatorul de conversie explicita ( cast ) se utilizeaz[ cand se doreşte ca tipul unui operand
(expresie) să fie altul decât cel implicit. Operatorul este unar, are prioritate ridicată şi are sintaxa:
( tip ) expresie
Exemplu: float r;
r=5/2; // impartirea se face în int, deci r va fi 2.0
r=(float)5/2; // r va fi 2.5

11. Operatorul condiţional ?

Operatorul conditional este singurul operator ternar. El se foloseste în situaţiile în care există două
variante de obţinere a unui rezultat, dintre care se alege una singură, funcţie de îndeplinirea sau
neîndeplinirea unei condiţii. Cei trei operanzi sunt expresii, prima reprezentand condiţia testată.
expr_logică ? expr1 : expr2

Dacă valoarea expr_logică este adevarată ( !=0 ), se evalueaza expr1, altfel expr2, rezultatul
expresiei evaluate fiind rezultatul final al expresiei condiţionale.

Exemple:

 Se iniţializează variabila max cu valoarea maximă dintre a şi b.


max=a>b?a:b;
Acelasi rezultat se obtine dacă se foloseşte instrucţiunea if:
if(a>b)max=a;
else max=b;

11. Operatorul virgula (secvential)

Se utilizează atunci când prelucrarea unei expresii formată din mai multe expresii separate prin
virgule. Evaluarea expresiei presupune evaluarea a două sau mai multor expresii; acestea se
evaluează de la stânga la dreapta, iar rezultatul (valoarea) întregii expresii este cel al ultimei expresii
( exprn ):

expr1,expr2,...,exprn

Exemplul 1: Expresia de mai jos memorează în max valoarea maximă dintre a şi b, realizând şi
ordonarea descrescătoare a acestora (deci le interschimba dacă a<b prin utilizarea unei variabile
auxiliare ):

int a,b,aux,max;
max=a>=b?a:(aux=b,b=a,a=aux);

19
Operatorul virgulă este necesar pentru a avea o singura expresie după :.
Folosind instructiunea if, prelucrarea de mai sus se poate scrie:
if(a<b)aux=b,b=a,a=aux;
max=a;

//interschimbare daca a<b, deci in a va fi valoarea maxima

sau:

if(a<b){aux=b;b=a;a=aux;}
max=a;

Exemplul 2:

int a=10, b=6, c, d; int a=10, b=6, c, d;


d=(c=a-6, a=b-c, b=c-a, a=a/2); c=a-6; a=b-c; b=c-a; a=a/2; d=a/2;
// 1 2 4 1

20
21

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