在下面的代码中:package mainimport "fmt"func main() { a := 1e6 b := 2 fmt.Println(b / a) fmt.Println(2 / a) }为什么语法有效?2/a为什么语法无效?b/a
3 回答
慕哥9229398
TA贡献1877条经验 获得超6个赞
为什么语法有效?
2/a
“对于其他二元运算符,操作数类型必须相同,除非操作涉及移位或无类型常量。 是一个非类型化常量。2
为什么语法无效?
b/a
事实并非如此。它在语法上是完全有效的;它只是语义上是错误的,因为它是对不匹配类型的操作。
收到一只叮咚
TA贡献1821条经验 获得超4个赞
它不是无效的语法。它是不匹配的类型:
invalid operation: b / a (mismatched types int and float64)
对于二进制操作,类型必须相同。 是 ,并且是 ,因此要执行操作,必须明确说明类型:b
int
a
float64
float64(b)/a
这将使两个操作数都成为 。所以会:float64
b/int(a)
其中两个操作数都是 。int
这不是问题,因为 是一个非类型化常量,其实际类型是根据上下文确定的。由于 是 ,在本例中是 。2/a
2
a
float64
2
float64
梦里花落0921
TA贡献1772条经验 获得超6个赞
其他答案提供了很好的观点,我只是想补充一下我对规则的记忆。首先是这个例子:
a := 1e6
b := 2
fmt.Println(b / a)
在此示例中,两个值都是“类型锁定”的,也就是说,在为每个变量声明一个类型后,您正在执行除法。由于类型不匹配,操作将失败:
invalid operation: b / a (mismatched types int and float64)
此示例:
a := 1e6
fmt.Println(2 / a)
现在尚未分配类型,因此它基本上可以是任何数字类型。既然是,那么只要说“好吧,我也会”,分裂就成功了。2afloat642float64
- 3 回答
- 0 关注
- 107 浏览
添加回答
举报
0/150
提交
取消