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

二元运算符 - 操作数类型应该是相同的?

二元运算符 - 操作数类型应该是相同的?

Go
慕侠2389804 2022-09-12 17:06:03
在下面的代码中: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

事实并非如此。它在语法上是完全有效的;它只是语义上是错误的,因为它是对不匹配类型的操作。


查看完整回答
反对 回复 2022-09-12
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

它不是无效的语法。它是不匹配的类型:

invalid operation: b / a (mismatched types int and float64)

对于二进制操作,类型必须相同。 是 ,并且是 ,因此要执行操作,必须明确说明类型:bintafloat64

float64(b)/a

这将使两个操作数都成为 。所以会:float64

b/int(a)

其中两个操作数都是 。int

这不是问题,因为 是一个非类型化常量,其实际类型是根据上下文确定的。由于 是 ,在本例中是 。2/a2afloat642float64


查看完整回答
反对 回复 2022-09-12
?
梦里花落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


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

添加回答

举报

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