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

位移 << 和乘法 * 优先级

位移 << 和乘法 * 优先级

Go
繁花不似锦 2022-06-13 17:17:14
在 Go 操场上尝试了这段代码:package mainimport (    "fmt")func main() {    log2Dim := uint32(9)        SIZE := 1 << 3 * log2Dim    fmt.Printf("Result: %v\n", SIZE)        SIZE = 1 << (3 * log2Dim)            // => only difference: adding ( )    fmt.Printf("Result: %v\n", SIZE)}这是打印出来的:Result: 72Result: 134217728为什么仅仅添加到包含和操作( )的语句中会产生巨大的差异?<<*据此,*有更高的优先级,<<也就是谷歌搜索bitshift优先级golang的第一个结果。
查看完整描述

2 回答

?
喵喵时光机

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

您链接到的页面是错误的。Go 只有一个规范,运算符优先级非常清楚:


二元运算符有五个优先级。乘法运算符绑定最强,其次是加法运算符、比较运算符、&&(逻辑与),最后是 || (逻辑或):


    5             *  /  %  <<  >>  &  &^

    4             +  -  |  ^

    3             ==  !=  <  <=  >  >=

    2             &&

    1             ||

相同优先级的二元运算符从左到右关联。例如,x / y * z 与 (x / y) * z 相同。


乘法和移位具有相同的优先级,因此适用“从左到右”规则,使您的代码相当于(1 << 3) * log2Dim


请注意,从左到右表示在代码中,而不是在优先级表中。从规范中给出的示例可以看出这一点。


查看完整回答
反对 回复 2022-06-13
?
慕沐林林

TA贡献2016条经验 获得超9个赞

二元运算符有五个优先级。*并且<<具有相同的优先级: 5. 相同优先级的二元运算符从左到右关联,所以1 << 3 * log2Dim等价于(1 << 3) * log2Dim

来源:https ://golang.org/ref/spec#Operators


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 213 浏览
慕课专栏
更多

添加回答

举报

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