Выражение
val1 + val2 * val3 * val4
имеет тип double
, но часть умножения имеет тип int32_t
. Если мы применяем правила его оценки, мы получаем
val1 + (val2 * val3 * val4)
, поскольку умножение имеет более высокий приоритет, оно будет оцениваться без учета типа val1
, и поскольку все операнды имеют одинаковый тип, тип результата будет таким же, как и у операндов. Этот результат затем преобразуется в double
и добавляется к val1
. Это поведение не изменилось ни в одной из версий C ++.
Чтобы умножение происходило как double
, вам нужно привести либо val2
, либо val3
к двойному, что сделает всю часть умножения оцененной как double
. Это будет выглядеть как
val1 + (static_cast<double>(val2) * val3 * val4)
скобки не нужны, но мне нравится использовать их для отображения группировки