在 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 關注
- 259 瀏覽
添加回答
舉報
0/150
提交
取消