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 // 按位清除赋值
}
完整优先级顺序(从高到低):
[]().->(后缀运算符)+-!^*&<-(一元运算符)*/%<<>>&&^+-|^==!=<<=>>=&&||=+=-=*=/=%=&=|=^=<<=>>=&^=
可以通过括号明确运算顺序:
result := (a + b) * c // 先加后乘

