use*_*291 -2 go operator-precedence
在 Go Playground 上尝试了以下代码:
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)
}
Run Code Online (Sandbox Code Playgroud)
这是打印出来的:
Result: 72
Result: 134217728
Run Code Online (Sandbox Code Playgroud)
为什么仅仅添加包含and操作的( )语句就会产生巨大的差异?<<*
据此,*具有更高的优先级,这<<是Google搜索bitshift优先级golang的第一个结果。
您链接到的页面是错误的。Go 只有一个规范,并且关于运算符优先级非常清楚:
二元运算符有五个优先级。乘法运算符绑定最强,其次是加法运算符、比较运算符、&&(逻辑与),最后是 || (逻辑或):
Run Code Online (Sandbox Code Playgroud)5 * / % << >> & &^ 4 + - | ^ 3 == != < <= > >= 2 && 1 ||相同优先级的二元运算符从左到右关联。例如,x / y * z 与 (x / y) * z 相同。
乘法和位移位具有相同的优先级,因此适用“从左到右”规则,使您的代码相当于(1 << 3) * log2Dim
请注意,从左到右意味着在代码中,而不是在优先级表中。从规范中给出的示例可以看出这一点。