位移位 << 和乘法 * 优先级

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的第一个结果。

Mar*_*arc 5

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

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

    5             *  /  %  <<  >>  &  &^
    4             +  -  |  ^
    3             ==  !=  <  <=  >  >=
    2             &&
    1             ||
Run Code Online (Sandbox Code Playgroud)

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

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

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