В C ++ эмпирическое правило:
Если операция включает в себя плавающий тип, оба операнда преобразуются в плавающий тип (результат имеет плавающий тип)
Имейте в виду, что operation
очень связан с operator
.И порядок операций определяется приоритетом оператора .
Приоритет основных операций в C ++ вполне естественен по математике:
*
, /
произойдет до +
, -
- выражения внутри
(
, )
произойдут первыми
Так что если у вас есть
float f = 1.0f + 1 / 2;
// then `f` will be `1.0f`, because
int sub = 1 / 2 ; // <- an integer division, happens first and gives 0
float f = 1.0f + sub; // <- 0 because the division result was evaluated first
Конечный результат имеет тип float
, поскольку последними операциями являются float + int
.
Другой пример, включающий выражения в скобках:
float f = (1.0f + 1) / 4;
// `f` will be `0.5` this time. The braced expressions happens first:
float sub = 1.0f + 1; // float + int = float
float f = sub / 4; // float / int = float
Здесь важно отметить, что преобразованиеот 4
до 4.0f
происходит до операции, как в этой примерной сборке:
// [mnemomic] [what]+ [target]
fload 1.0f, float_register_0
fload 1, float_register_1
fadd float_register_0, float_register_1, float_register_2 // sub is in [2]
fload 4, float_register_3 // 4 is in [3]
fdiv float_register_2, float_register_3, f // [2]/[3] -> f
Помните
Если операция включает в себя плавающий тип, оба операнда преобразуются в плавающий тип (результат имеет плавающий тип)