位移 << 和乘法 * 优先级

在 Go 操场上尝试了这段代码:


package main


import (

    "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: 72

Result: 134217728

为什么仅仅添加到包含和操作( )的语句中会产生巨大的差异?<<*


据此,*有更高的优先级,<<也就是谷歌搜索bitshift优先级golang的第一个结果。


繁花不似锦
浏览 214回答 2
2回答

喵喵时光机

您链接到的页面是错误的。Go 只有一个规范,运算符优先级非常清楚:二元运算符有五个优先级。乘法运算符绑定最强,其次是加法运算符、比较运算符、&&(逻辑与),最后是 || (逻辑或):&nbsp; &nbsp; 5&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*&nbsp; /&nbsp; %&nbsp; <<&nbsp; >>&nbsp; &&nbsp; &^&nbsp; &nbsp; 4&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;+&nbsp; -&nbsp; |&nbsp; ^&nbsp; &nbsp; 3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;==&nbsp; !=&nbsp; <&nbsp; <=&nbsp; >&nbsp; >=&nbsp; &nbsp; 2&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&&&nbsp; &nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;||相同优先级的二元运算符从左到右关联。例如,x / y * z 与 (x / y) * z 相同。乘法和移位具有相同的优先级,因此适用“从左到右”规则,使您的代码相当于(1 << 3) * log2Dim请注意,从左到右表示在代码中,而不是在优先级表中。从规范中给出的示例可以看出这一点。

慕沐林林

二元运算符有五个优先级。*并且<<具有相同的优先级: 5. 相同优先级的二元运算符从左到右关联,所以1 << 3 * log2Dim等价于(1 << 3) * log2Dim。来源:https ://golang.org/ref/spec#Operators
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go