Golang语言居然没有运算符优先级表!

Golang语言居然没有运算符优先级表! 帮助文档中没有Go语言的运算符优先级表。我希望能有一份这样的图表。请按优先级顺序列出所有运算符。请按优先级顺序列出所有运算符。这是一个不足之处。

2 回复

引用自规范

运算符优先级

一元运算符具有最高的优先级。由于 ++-- 运算符构成的是语句,而非表达式,因此它们不在运算符的层级体系之内。因此,语句 *p++ 等同于 (*p)++

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

Precedence    Operator
    5             *  /  %  <<  >>  &  &^
    4             +  -  |  ^
    3             ==  !=  <  <=  >  >=
    2             &&
    1             ||

相同优先级的二元运算符从左向右结合。例如,x / y * z 等同于 (x / y) * z

+x                         // x
42 + a - b                 // (42 + a) - b
23 + 3*x[i]                // 23 + (3 * x[i])
x <= f()                   // x <= f()
^a >> b                    // (^a) >> b
f() || g()                 // f() || g()
x == y+1 && <-chanInt > 0  // (x == (y+1)) && ((<-chanInt) > 0)

更多关于Golang语言居然没有运算符优先级表!的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go语言确实有明确的运算符优先级,虽然没有单独的优先级表,但规范中定义了优先级顺序。以下是按优先级从高到低排列的所有运算符:

package main

import "fmt"

func main() {
    // 1. 最高优先级:后缀运算符
    a := []int{1, 2, 3}
    fmt.Println(a[0])    // 下标访问
    fmt.Println(&a[0])   // 取地址
    fmt.Println(a[0:2])  // 切片
    
    // 结构体字段访问
    type Point struct{ X, Y int }
    p := Point{1, 2}
    fmt.Println(p.X)     // 字段访问
    
    // 函数调用
    fmt.Println("Hello")
    
    // 2. 一元运算符
    x := 10
    fmt.Println(+x)      // 正号
    fmt.Println(-x)      // 负号
    fmt.Println(!true)   // 逻辑非
    fmt.Println(^x)      // 按位取反
    fmt.Println(*&x)     // 指针解引用
    fmt.Println(&x)      // 取地址
    fmt.Println(<-ch)    // 通道接收
    
    // 3. 乘除类运算符
    fmt.Println(10 * 5)  // 乘法
    fmt.Println(10 / 5)  // 除法
    fmt.Println(10 % 5)  // 取模
    fmt.Println(10 << 2) // 左移
    fmt.Println(10 >> 2) // 右移
    fmt.Println(10 & 5)  // 按位与
    fmt.Println(10 &^ 5) // 按位清除
    
    // 4. 加减类运算符
    fmt.Println(10 + 5)  // 加法
    fmt.Println(10 - 5)  // 减法
    fmt.Println(10 | 5)  // 按位或
    fmt.Println(10 ^ 5)  // 按位异或
    
    // 5. 比较运算符
    fmt.Println(10 == 5) // 等于
    fmt.Println(10 != 5) // 不等于
    fmt.Println(10 < 5)  // 小于
    fmt.Println(10 <= 5) // 小于等于
    fmt.Println(10 > 5)  // 大于
    fmt.Println(10 >= 5) // 大于等于
    
    // 6. 逻辑与
    fmt.Println(true && false)
    
    // 7. 逻辑或
    fmt.Println(true || false)
    
    // 8. 最低优先级:赋值运算符
    y := 10
    y += 5      // 加赋值
    y -= 3      // 减赋值
    y *= 2      // 乘赋值
    y /= 4      // 除赋值
    y %= 3      // 取模赋值
    y &= 7      // 按位与赋值
    y |= 8      // 按位或赋值
    y ^= 4      // 按位异或赋值
    y <<= 2     // 左移赋值
    y >>= 1     // 右移赋值
    y &^= 3     // 按位清除赋值
}

完整优先级顺序(从高到低):

  1. [] () . ->(后缀运算符)
  2. + - ! ^ * & <-(一元运算符)
  3. * / % << >> & &^
  4. + - | ^
  5. == != < <= > >=
  6. &&
  7. ||
  8. = += -= *= /= %= &= |= ^= <<= >>= &^=

可以通过括号明确运算顺序:

result := (a + b) * c  // 先加后乘
回到顶部