Эта строка:
p.X = 1e9
Является назначением . Spe c имеет следующее требование для присвоений:
В присваиваниях каждое значение должно быть присваиваемым типу операнда, которому оно назначено ...
И следующее правило присваивания охватывает вышеупомянутое присвоение:
1e9
является нетипизированной константой с плавающей запятой , и значение точно представлено значением типа int
, так что все хорошо.
Было бы ошибкой во время компиляции, если бы она была типизированной константой, например,
p.X = float64(1e9)
// error: cannot use float64(1e+09) (type float64) as type int in assignment
Поскольку вышеупомянутое правило присваивания не будет применяться, и ни все другие правила.
То же самое происходит, если нетипизированное значение константы с плавающей запятой не может быть представлено значением типа int
, например, в следующих случаях:
p.X = 1e99
// error: constant overflows int
p.X = 1.1
// error: constant 1.1 truncated to integer