操作符 Precedence
 
当在单个表达式中发生多个操作时,将以预定顺序评估和解析每个操作。这被称为操作顺序或运算符优先级。

如果一个表达式中的运算符具有较高的优先级,则在较低优先级的运算符之前进行求值。

如果操作者具有相同的优先级,则按照其关联性的顺序进行评估。关联性可以是从左到右或从右到左的顺序。

通常,二进制运算符(例如+^)和一元后缀运算符(例如()->)被评估为从左到右,一元前缀运算符(例如Not@)从右到左进行评估。

具有“N / A”的关联性的运算符表示,无论按优先级还是关联性,都不需要检查其操作顺序,可以使用操作符的表达式。像Cast这样的类似功能的运算符由于其语法中需要的括号,始终是第一个被评估的运算符。赋值运算符总是最后一个被评估。

圆括号可用于覆盖运算符优先级。括号内的操作在其他操作之前执行。在括号内使用正常运算符优先级。

下表列出了从最高到最低的运算符优先级。表中的突破标记了具有相同优先级的运算符组。

最高优先级

操作者描述关联性
   
CAST类型转换N/A
PROCPTR程序指针N/A
STRPTR字符串指针N/A
VARPTR变量指针N/A
   
[]字符串索引Left-to-Right
[]指针索引Left-to-Right
()数组索引Left-to-Right
()函数调用Left-to-Right
.成员访问Left-to-Right
->指向成员访问Left-to-Right
   
@的地址Right-to-Left
*取数据值Right-to-Left
New赋值内存Right-to-Left
Delete取消赋值内存Right-to-Left
   
^取幂Left-to-Right
   
-求反Right-to-Left
   
*Left-to-Right
/除以Left-to-Right
   
\整数除法Left-to-Right
   
MOD余数Left-to-Right
   
SHL位左移Left-to-Right
SHR位右移Left-to-Right
   
+Left-to-Right
-减去Left-to-Right
   
&字符串连接Left-to-Right
   
Is运行时类型信息检查N/A
   
=等于Left-to-Right
<>不平等Left-to-Right
<少于Left-to-Right
<=小于或等于Left-to-Right
>=大于或等于Left-to-Right
>大于Left-to-Right
   
NOT求位反码Right-to-Left
   
AND位逻辑与Left-to-Right
   
OR位逻辑或Left-to-Right
   
EQV等价Left-to-Right
IMP意义Left-to-Right
XOR位异或Left-to-Right
   
ANDALSO短路逻辑与Left-to-Right
ORELSE短路逻辑或Left-to-Right
   
=赋值N/A
&=连接和赋值N/A
+=添加和赋值N/A
-=减去和赋值N/A
*=乘法和赋值N/A
/=除以和赋值N/A
\=整数分割和赋值N/A
^=指数和赋值N/A
MOD=模数和赋值N/A
AND=连接和赋值N/A
EQV=等同和赋值N/A
IMP=含义和赋值N/A
OR=位或和赋值N/A
XOR=位异或和赋值N/A
SHL=向左移动并赋值N/A
SHR=向右移动并赋值N/A
LET赋值N/A
   
LET()赋值N/A


在某些情况下,优先顺序可能导致混乱或反直觉的结果。这里有些例子:
'' trying to raise a negated number to a power
-2
 ^ 2
Desired result: (-2) ^ 2 = 4
Actual result:   -(2 ^ 2) = -4

'' trying to test a bit in a number
n And 1  <>  0
Desired result: (n And 1) <> 0
Actual result:   n And (1 <> 0)

'' trying to shift a number by n+1 bits
a Shl n+1
Desired result: a Shl (n + 1)
Actual result: (a Shl n) + 1

对于运算符优先级可能不明确的表达式,建议将表达式的部分包含在括号中,以便尽可能减少错误的可能性,并帮助读者阅读代码。

参考