运算符的优先级

前面介绍了算术运算符、比较运算符、逻辑运算符等各种运算符,如果一个表达式中有多种运算符,那么先算哪个后算哪个就要遵循一定的规则。这个规则就是先算优先级高的,再算优先级低的,如果各运算符优先级相同,按照从左到右的顺序计算。比如四则运算1+2*3-4/2,将加减法和乘除法放在一起作计算,因为乘除法的优先级比加减法的高,所以要先算乘除法,后算加减法。这是我们很熟悉的。

【Excel VBA】

表3-9列出了Excel VBA中各种主要的运算符以及它们在表达式中的计算优先级。

表3-9 运算符的优先级

运算符 运算符说明 优先级
( ) 小括号 16
x(i) 索引运算 15
^ 指数运算 14
~ 按位取反 13
+(正号), -(负号) 正负号 12
*, / 乘除 11
// 整除 10
% 取模 9
+, - 加减 8
& 字符串连接符 7
=, <>, >, >=, <, <=, Like, New, TypeOf, Is, IsNot 比较运算和身份运算 6
Not 逻辑非 5
And 逻辑与 4
Or 逻辑或 3
Xor 异或运算 2
Eqv 等价运算 1

【Python】

表3-10列出了Python中各种主要的运算符以及它们在表达式中的计算优先级。

表3-10 运算符的优先级

运算符 运算符说明 优先级
( ) 小括号 18
x[i] 索引运算 17
x.attribute 属性和方法访问 16
** 指数运算 15
~ 按位取反 14
+(正号), -(负号) 正负号 13
*, /, //, % 乘除 12
+, - 加减 11
>>, << 移位 10
& 按位与 9
^ 按位异或 8
| 按位或 7
==, !=, >, >=, <, <= 比较运算 6
is, is not 身份运算 5
in, not in 成员运算 4
not 逻辑非 3
and 逻辑与 2
or 逻辑或 1

下面举几个例子说明运算符优先级的应用。Excel VBA代码示例文件的存放路径为Samples\ch03\Excel VBA\运算符的优先级.xlsm。

对于下面四则运算的算术运算表达式,先算乘除法,后算加减法。

【Excel VBA】

code.vba
Debug.Print 1+2*3-4/2  '5

【Python】

code.python
>>> 1+2*3-4/2
5.0

因为除法运算返回的结果是浮点型的,最后得到的结果也是浮点型的。下面如果希望先算1+2,将它们的和再乘以3,可以用小括号改变加法运算的优先级。如果小括号有嵌套,先算里面的。

【Excel VBA】

code.vba
Debug.Print((1+2)*3-4)/2  '2.5

【Python】

code.python
>>> ((1+2)*3-4)/2
2.5

下面的表达式中有关系运算和逻辑运算,先算关系运算,再算逻辑运算。

【Excel VBA】

code.vba
Debug.Print 3>2 and 7<5  'False

【Python】

code.python
>>> 3>2 and 7<5
False

表达式中,关系表达式3>2返回True,关系表达式7<5返回False,最后算逻辑表达式True and False,返回False。