Язык С++ достаточно свободно обращается с выражениями, включающими в себя различные типы данных. В С++ различают неявное преобразование типов и явное. Неявное преобразование типов в выражениях со смешанными типами данных осуществляется автоматически компилятором согласно иерархии типов данных, по которой у каждого типа данных имеется свой приоритет по отношению к другим типам. Приведём иерархию типов данных, перечислив основные типы по старшинству, от низшего к высшему: char [ short [ int [ long int [ float [ double [ long double. Таким образом, если в арифметическом выражении присутствуют операнды различного типа, то в этом случае операнд с более "низким" типом будет преобразован компилятором к более "высокому" типу. Рассмотрим пример:
#include <iostream>
#include <conio>
using namespace std;
int main() {
int i = 7;
float f = 1.5;
double d = i * f;
cout <<"Результат равен " << d << endl; // d=10.5
getch(); return 0;
}
При компиляции данной программы, тип int переменной i автоматически преобразовывается в вещественный тип, а затем результат умножения преобразовывается к типу double. Однако, необходимо помнить, что в ряде случаев (особенно при целочисленных вычислениях) могут возникать ошибки из-за того, что компилятор не осуществляет преобразования типов.
#include <iostream>
#include <conio>
using namespace std;
int main() {
int a = 5, b = 2;
a=a/b*10;
cout <<"Результат равен " << a << endl; // a=20 - ошибка. Должно быть 25
getch(); return 0;
}
Из-за того, что в данной программе происходит деление величин целого типа, возникает ситуация, когда получающаяся в результате деления дробная часть отбрасывается, из-за того, что эти величины определены как целые. В итоге мы получаем неправильный ответ 20, вместо 25. Для решения этой проблемы можно определить переменные a и b как float, а можно осуществить явное преобразование типов следующим образом.
int main() {
int a = 5, b = 2;
a = static_cast<float>(a) / b * 10.0; //преобразовываем переменную а к вещественному типу
cout <<"Результат равен " << a << endl; // a=25
getch();
return 0;
}
Здесь, с помощью оператора явного приведения типов static_cast<новый тип> (переменная)мы устранили ошибку. Наряду с таким способом приведения типов, существуют другие способы в стиле С: a = float(a) / b * 10.0; или a = (float)a / b * 10.0;. Недостаток последних двух форматов заключается в том, что их трудно найти в большом коде программы как визуально, так и с помощью команды поиска.