前面介绍了算术运算符、比较运算符、逻辑运算符等各种运算符,如果一个表达式中有多种运算符,那么先算哪个后算哪个就要遵循一定的规则。这个规则就是先算优先级高的,再算优先级低的,如果各运算符优先级相同,按照从左到右的顺序计算。比如四则运算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。