Teorie: Tipul expresiilor în C++. Conversii de tip
Tipul expresiilor în C++. Conversiile de tip în C++, conversii implicite și explicite.
Tipul Expresiilor
În limbajul C++, o expresie este formată din operanzi (variabile, constante) și operatori. Fiecare expresie, după ce este evaluată, are un rezultat care are o anumită valoare și un anumit tip de dată.
Regula generală este că tipul unei expresii este dat de cel mai "încăpător" (sau cel mai precis) tip de dată dintre operanzii care participă la acea expresie.
1. Conversia Implicită
Conversia implicită este realizată automat de către compilator atunci când evaluăm o expresie cu operanzi de tipuri diferite.
Ierarhia de conversie (de la cel mai mic la cel mai mare):
bool → char → short → int → long long → float → double
int a = 5;
double b = 2.5;
// Expresia a + b va fi de tip double, deoarece double e superior lui int.
// Valoarea 5 este convertită automat la 5.0 înainte de adunare.
double rezultat = a + b; // rezultat = 7.52. Conversia Explicită (Casting)
Conversia explicită este forțată de către programator folosind operatorul de conversie numit cast. Aceasta este utilă pentru a evita trunchierile incorecte, în special la împărțirea numerelor întregi.
- Sintaxa C-style:
(tip_nou) expresie
int x = 5, y = 2;
// Împărțirea a doi întregi dă un întreg (5 / 2 dă 2).
float gresit = x / y; // gresit va fi 2.0
// Folosim conversia explicită pentru a obține un rezultat real.
float corect = (float)x / y; // corect va fi 2.5
// Invers: float -> int (taie zecimalele)
float f = 3.99;
int i = (int)f; // i va fi 3char litera = 'A';
// Aflăm codul ASCII al literei 'A'
int codAscii = (int)litera; // codAscii va fi 65
// Invers: obținem caracterul pe baza unui cod ASCII
int cod = 97;
char caracter = (char)cod; // caracter va fi 'a'3. Funcții Predefinite în Expresii
Limbajul C++ oferă o serie de funcții matematice predefinite extrem de utile în construirea expresiilor. Pentru a le folosi, trebuie să includem biblioteca <cmath> (sau <math.h>).
abs(x) / fabs(x)Modulul lui x (abs pt întregi, fabs pt reali).
sqrt(x)Rădăcina pătrată a lui x (radicalul). Argumentul trebuie să fie pozitiv.
pow(x, y)Returnează x la puterea y (xy).
floor(x) / ceil(x)floor rotunjește în jos, iar ceil rotunjește în sus.
trunc(x) / round(x)trunc taie zecimalele, round rotunjește la cel mai apropiat întreg.
exp(x)Returnează numărul lui Euler e la puterea x (ex).
Important pentru Bacalaureat
Multe expresii aritmetice de la subiectul I vă vor cere să transcrieți formule matematice în C++. Atenție la ordinea operațiilor și folosiți sqrt() în loc de notația matematică clasică.
Capcană la Bacalaureat
În grilele de la subiectul I este extrem de frecventă capcana împărțirii numerelor întregi. Rețineți întotdeauna că:
10 / 3 // este egal cu 3 (partea întreagă)
10.0 / 3 // este egal cu 3.333... (deoarece un operand este real)
(double)10 / 3 // este egal cu 3.333...