最准确的Go语言运算符优先级介绍

Overview

前言

写Go代码时一下子想不起准确的运算符优先级了,Google搜索了下,发现前面几个SEO做的比较好的网址给的要不就是错的,要不就是写的乱七八糟,误人子弟。喷的就是下面这几个出错的:

这几个基本上是互相抄的,没有验证,很容易反驳。比如,上面说"+", "-"的优先级大于“|”,那么以下代码

1a := 2 | 4 - 1

的结果应该等同于

1a := 2 | (4 - 1)

但实际上前者结果为5,后者的答案是3。原因是“-”运算符优先级与“|”实际上是相等的。

验证链接: https://go.dev/play/p/fPFNO8r6bJ3

简单分享下正确的运算符优先级,避免后人踩坑。

正确的运算符优先级

Google找到了官方的说明:

可以参考其中Operator Precedence一节,介绍的非常清楚。

  1. 单目运算符优先级最高。

单目运算符包括:

1"+" | "-" | "!" | "^" | "*" | "&" | "<-" 
  1. 双目运算符分5个优先级,从高到低为
1Precedence    Operator
2    5             *  /  %  <<  >>  &  &^
3    4             +  -  |  ^
4    3             ==  !=  <  <=  >  >=
5    2             &&
6    1             ||

分别是: “乘法类”,“加法类”,“比较类”,“逻辑与”,“逻辑或”,优先级最低的是“逻辑或”。