最准确的Go语言运算符优先级介绍
Overview
前言
写Go代码时一下子想不起准确的运算符优先级了,Google搜索了下,发现前面几个SEO做的比较好的网址给的要不就是错的,要不就是写的乱七八糟,误人子弟。喷的就是下面这几个出错的:
- https://haicoder.net/golang/golang-operator-precedence.html
- http://c.biancheng.net/view/5559.html
- http://gitbook.net/go/go_operators_precedence.html
这几个基本上是互相抄的,没有验证,很容易反驳。比如,上面说"+", "-"的优先级大于“|”,那么以下代码
1a := 2 | 4 - 1
的结果应该等同于
1a := 2 | (4 - 1)
但实际上前者结果为5,后者的答案是3。原因是“-”运算符优先级与“|”实际上是相等的。
验证链接: https://go.dev/play/p/fPFNO8r6bJ3
简单分享下正确的运算符优先级,避免后人踩坑。
正确的运算符优先级
Google找到了官方的说明:
可以参考其中Operator Precedence一节,介绍的非常清楚。
- 单目运算符优先级最高。
单目运算符包括:
1"+" | "-" | "!" | "^" | "*" | "&" | "<-"
- 双目运算符分5个优先级,从高到低为
1Precedence Operator
2 5 * / % << >> & &^
3 4 + - | ^
4 3 == != < <= > >=
5 2 &&
6 1 ||
分别是: “乘法类”,“加法类”,“比较类”,“逻辑与”,“逻辑或”,优先级最低的是“逻辑或”。