Явное / неявное преобразование типов C++
У меня есть строка кода
double i = 1 + (long)1.5* 5.0f
Мой вопрос: каков порядок конвертации и результат? Поиск таких примеров, но безрезультатно. Есть ли хорошие гиды, которые могут помочь мне понять это?
4 ответа
Мой вопрос: каков порядок конвертации и результат?
В ролях применяется к 1.5
, давая long
со значением 1
,
Это преобразовано в float
для умножения с 5.0f
, давая float
со значением 5.0f
,
1
преобразуется в float
для сложения с этим значением, давая float
со значением 6.0f
,
Наконец, это повышен до double
(сохраняя значение 6.0
) назначить i
,
Это предполагает не сумасшедший формат с плавающей запятой, который может точно представлять маленькие целые числа; в противном случае возможны ошибки округления.
Если вы хотите привести результат умножения, используйте круглые скобки для управления приоритетом оператора:
double i = 1 + (long)(1.5* 5.0f); // = 8.0
или используйте приведение в стиле C++, которое вызывает использование скобок:
double i = 1 + static_cast<long>(1.5* 5.0f)
Есть ли хорошие гиды, которые могут помочь мне понять это?
Вот один из них: http://en.cppreference.com/w/cpp/language/operator_precedence. Обратите внимание, что приведение типа имеет более высокий приоритет, чем умножение, что, в свою очередь, выше, чем сложение (3 против 5 против 6).
Как видно из этой таблицы, оператор приведения имеет более высокий приоритет, чем умножение, но следуйте советам использовать круглые скобки.
Если вы не уверены, каков приоритет оператора приведения, перепишите выражение (в вашей голове)
(long)1.5 * 5.0
в
5.0 * (long)1.5
Здесь довольно очевидно, что имеет приоритет и то же самое с первой версией
Эта таблица приоритетов должна рассказать вам все, что вам нужно знать.
- Кастинг:
1.5
приведен кlong
- Умножение:
1.5 * 5.0f
, который бросает этот продукт какfloat
- Дополнение:
1 + ( ((long) 1.5) * 5.0f)
- Назначение:
i = 1 + ((long) 1.5 * 5.0f)