В
1/60
Оба операнда являются целыми числами, поэтому выполняется целочисленная арифметика. Для выполнения арифметики с плавающей запятой, по крайней мере, один из операндов должен иметь тип с плавающей запятой. Например, любое из следующего будет выполнять деление с плавающей запятой:
1.0/60
1.0/60.0
1/60.0
(вместо этого вы можете выбрать 1.0f
, чтобы избежать предупреждений о снижении точности; 1.0
имеет тип double
, а 1.0f
имеет тип float
)
Не должно ли TEST_FLOAT
иметь то же значение, что и TEST_C
?
В случае TEST_FLOAT
выполняется целочисленное деление, а затем результат целочисленного деления преобразуется в float
в присваивании.
В случае TEST_C
целочисленные литералы 1
и 60
преобразуются в float
, когда им назначаются TEST_A
и TEST_B
; затем выполняется деление с плавающей точкой на эти числа и результат присваивается TEST_C
.
Разрешено ли значение TEST_C
во время компиляции или во время выполнения?
Это зависит от компилятора; любой метод соответствовал бы стандартам.