在 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
请注意,从左到右表示在代码中,而不是在优先级表中。从规范中给出的示例可以看出这一点。
慕沐林林
TA贡献2016条经验 获得超9个赞
二元运算符有五个优先级。*
并且<<
具有相同的优先级: 5. 相同优先级的二元运算符从左到右关联,所以1 << 3 * log2Dim
等价于(1 << 3) * log2Dim
。
来源:https ://golang.org/ref/spec#Operators
- 2 回答
- 0 关注
- 213 浏览
添加回答
举报
0/150
提交
取消