- Тип результата выражения
- Работа
Тип результата выражения
Выражения могут состоять из операндов различных типов, например, не возбраняется осуществлять суммирование переменных типа char и long, double и unsigned int и т.д. И результат этих вычислений так же может быть присвоен переменной любого типа. Как же ведет себя компилятор в этом случае?
Рассмотрим следующий пример:
int xl = 20000, x2 = 15;
long res;
res = xl * x2;
Переменной res (длинное целое) присваивается результат произведения двух чисел (int), значения переменных укладываются в допустимые диапазоны, ожидается, что значение res будет 300000. Однако, это ошибочное предположение.
Стандартом Си определено, что тип результата выражения определяется по набольшему типу входящего в него операнда, т.е. в данном случае результат х1 * х2 будет иметь тип int. Разумеется, произведение чисел вызовет переполнение результата, и все, что «не влезло» в размер, будет отброшено, т.е. в результате произведение будет равно -27680.
Такой странный результат получился из-за несоответствия типа результата выражения и типа операндов. Чтобы получить верный результат, нужно использовать один из операндов типа long:
res = (long)xl * х2;
// или так
res = xl * (long)х2;
Такая запись показывает, что компилятор должен воспринимать операнд х1, как число типа long. Принудительное указание в круглых скобках нового типа для выражения называется явным преобразованием или приведением типа. Ошибкой будет попытка задать тип для результата всего выражения:
res = (long) (xl * х2) ;
Такая запись ничем не отличается от первоначальной и даст неверный результат (т.к. в этой записи явно указано то преобразование, которое компилятор и так делает автоматически).
Компилятор всегда приводит автоматически типы всех операндов в выражении к наибольшему типу, т.е. от меньшего типа к большему. Важно помнить, что если в выражении все операнды типа char, то они будут приведены к типу int, если нет явного преобразования типов. При помощи приведения типа программист может изменить его поведение, что чревато большими ошибками.