Вопрос: что такое порядок преобразования и результат?
Бросок применяется к 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. Обратите внимание, что тип cast имеет более высокий приоритет, чем умножение, что в свою очередь выше, чем добавление (3 против 5 против 6).
Если вы не уверены, поместите скобки в свой код. ((long) (1.5 * 5.0f)) –
Вы говорите о таблице приоритетов? –
@MartinPerry - если вы не уверены, сделайте некоторое исследование. Слепое добавление круглых скобок обычно делает нечитаемый беспорядок. Или, в этом случае, используйте новый стиль: 'static_cast (1.5 * 5.0f)' кажется хорошим кандидатом. –