为了账号安全,请及时绑定邮箱和手机立即绑定

将浮点数分配给结构的整数元素

将浮点数分配给结构的整数元素

Go
慕村9548890 2022-05-05 16:02:09
我正在参加巡回赛,我对 4/27 感到困惑(https://tour.golang.org/moretypes/4)package mainimport "fmt"type Vertex struct {    X int    Y int}func main() {    v := Vertex{1, 2}    p := &v    p.X = 1e9 // <- this line does not produce a type error    fmt.Println(v) // {1000000000 2} implicite conversion of int to float?}我希望在 JavaScript 中做到这一点,而不是在强类型语言中。我一定错过了一些基本的东西。
查看完整描述

3 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

这一行:

 p.X = 1e9

是一个任务。Spec 对分配有以下要求:

在赋值中,每个值都必须可以分配给它所分配的操作数的类型......

以下可分配性规则涵盖了上述分配:

  • x是一个无类型的常量 ,可由 type 的值表示T

1e9是一个无类型的浮点常量,并且该值可以由一个类型的值int精确表示,所以一切都很好。

如果它是一个类型化的常量,那将是一个编译时错误,例如

p.X = float64(1e9)
// error: cannot use float64(1e+09) (type float64) as type int in assignment

因为上述可分配性规则将不适用,所有其他规则也不适用。

如果无类型浮点常量值不能用 type 的值表示,情况也是int如此,例如在这些情况下:

p.X = 1e99
// error: constant overflows int
p.X = 1.1
// error: constant 1.1 truncated to integer


查看完整回答
反对 回复 2022-05-05
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

常量值由符文、整数、浮点数、虚数或字符串字面量表示,...


数字常量表示任意精度的精确值并且不会溢出。


常量可以有类型或无类型。文字常量 ... 是无类型的。


在变量声明中使用时,可以隐式地为常量赋予类型……。如果常量值不能表示为相应类型的值,则这是错误的。


type Vertex struct {

    X int

    Y int

}


v := Vertex{1, 2}

p := &v

p.X = 1e9 // <- this line does not produce a type error

1e9是一个无类型的数字常量,表示为浮点文字。


当无类型的数字常量1e9被分配给一个int变量 ( p.X, type Vertex {X int}) 时,它会int隐式地给定类型。1e9( 1,000,000,000) 可以表示为 type 的值int。


查看完整回答
反对 回复 2022-05-05
?
米脂

TA贡献1836条经验 获得超3个赞

Go 编程语言规范/转换

转换可能按字面意思出现在源代码中,也可能由表达式出现的上下文暗示。

Go 编程语言规范/数字类型之间的转换

  1. 将浮点数转换为整数时,会丢弃小数(截断至零)。

这里:

p.x = 1e9 // it's floating literal with implied conversion by context

https://golang.org/ref/spec#Conversions


查看完整回答
反对 回复 2022-05-05
  • 3 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信