Skip to content

运算符优先级


当单个表达式中出现多个运算时,每个运算都按预定顺序求值和解析。这称为运算顺序或运算符优先级。

如果表达式中某个运算符的优先级更高,它会在优先级较低的运算符之前求值。

如果运算符优先级相同,则按其结合性顺序求值。结合性可以是从左到右或从右到左。

一般规则是,二元运算符(如 +^)和一元后缀运算符(如 ()->)从左到右求值,一元前缀运算符(如 Not@)从右到左求值。

结合性为"N/A"的运算符表示在表达式中使用该运算符时,不需要通过优先级或结合性来检查其运算顺序。类似函数的运算符(如 Cast)由于其语法中需要括号,总是最先求值。赋值运算符总是最后求值。

括号可用于覆盖运算符优先级。括号内的运算先于其他运算执行。括号内使用正常的运算符优先级。

下表按从高到低的顺序列出了运算符优先级。表格中的分隔符标记了优先级相同的运算符组。

最高优先级

运算符说明结合性
CAST类型转换N/A
PROCPTR过程指针N/A
STRPTR字符串指针N/A
VARPTR变量指针N/A
[]字符串索引从左到右
[]指针索引从左到右
()数组索引从左到右
()函数调用从左到右
.成员访问从左到右
->指针成员访问从左到右
@取地址从右到左
*取值从右到左
New分配内存从右到左
Delete释放内存从右到左
^幂运算从左到右
-取负从右到左
*乘法从左到右
/除法从左到右
\整除从左到右
MOD取模从左到右
SHL左移从左到右
SHR右移从左到右
+加法从左到右
-减法从左到右
&字符串连接从左到右
Is运行时类型信息检查N/A
=等于从左到右
<>不等于从左到右
<小于从左到右
<=小于或等于从左到右
>=大于或等于从左到右
>大于从左到右
NOT按位取反从右到左
AND逻辑与从左到右
OR逻辑或(包含)从左到右
EQV逻辑等价从左到右
IMP逻辑蕴含从左到右
XOR逻辑异或从左到右
ANDALSO短路逻辑与从左到右
ORELSE短路逻辑或(包含)从左到右
=[>]赋值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

在某些情况下,优先级顺序可能产生令人困惑或反直觉的结果。以下是一些示例:

start GeSHi

'' 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

end GeSHi

对于运算符优先级可能存在歧义的表达式,建议用括号将表达式的各部分括起来,这样既能最大限度地减少出错的可能性,也有助于阅读代码的人理解。

参见

返回目录返回程序员指南

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系