У меня есть строка кода
double i = 1 + (long)1.5* 5.0f
Мой вопрос: каков порядок конвертации и результат? Поиск таких примеров, но безрезультатно. Есть ли хорошие гиды, которые могут помочь мне понять это?
Мой вопрос: каков порядок конвертации и результат?
В ролях применяется к 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).
Как вы можете видеть из этот стол, оператор приведения имеет более высокий приоритет, чем умножение, но следуйте советам использовать скобки.
Эта таблица приоритетов должен рассказать вам все, что вам нужно знать.
1.5
приведен к long
1.5 * 5.0f
, который бросает этот продукт как float
1 + ( ((long) 1.5) * 5.0f)
i = 1 + ((long) 1.5 * 5.0f)
Если вы не уверены, каков приоритет оператора приведения, перепишите выражение (в вашей голове)
(long)1.5 * 5.0
в
5.0 * (long)1.5
Здесь довольно очевидно, что имеет приоритет и то же самое с первой версией