Object Pascal 手册,Delphi 11 编程语言的完整介绍 作者: Marco Cantu 笔记:豆豆爸
2.4.2 运算符和优先级
表达式由应用于值的运算符组成。正如我之前提到的,大多数运算符在各种编程语言中都是相当直观的,比如基本的匹配和比较运算符。在本节中我将仅突出 Object Pascal
运算符的特定方面。
您可以看到下面按优先级分组的语言运算符列表,并与 C#、Java 和 Objective-C 中的运算符进行比较(以及基于 C 语言语法的大多数语言)。
关系和比较运算符(最低优先级)
=
:测试是否相等(在 C 中是 ==)<>
:测试是否不相等(在 C 中是 !=)<
:测试是否小于>
:测试是否大于<=
:测试是否小于或等于,或者是集合的子集>=
:测试是否大于或等于,或者是集合的超集in
:测试一个条目是否是集合的成员is
:测试对象是否与给定类型兼容(在第 8 章中介绍)或是否实现了给定接口(在第 11 章中介绍)
加法运算符
+
:算术加法、集合求并、字符串连接、指针偏移量加法-
:算术减法、集合求差、指针偏移量减法or
:布尔或者位或(在 C 中是 || 或 |)xor
:布尔或者位异或(在 C 中是 ^)
乘法和位运算符
*
:算术乘法或集合求交集/
:浮点数除法div
:整数除法(在 C 中这也使用 /)mod
:求模(整数除法的余数)(在 C 中是 %)as
:允许在运行时进行检查类型的转换(在第 8 章中介绍)and
:布尔或者位与(在 C 中是 && 或 &)shl
:位左移(在 C 中是 <<)shr
:位右移(在 C 中是 >>)
一元运算符(最高优先级)
@
:变量或函数的内存地址(返回一个指针,在 C 中是 &)not
:布尔或者位非(在 C 中是 !)
与许多其他编程语言不同,逻辑运算符(包括 and
、or
和 not
)的优先级高于比较运算符(包括小于和大于)。所以如果您写:
a < b and c < d
编译器将首先执行 and
操作,通常导致表达式中的类型兼容性编译器错误。如果要测试两个比较,您应该将每个小于表达式括在括号中:
(a < b) and (c < d)
对于数学运算而言,通常的规则也适用,乘法和除法的优先级高于加法和减法。前两个表达式是等效的,而第三个是不同的:
10 + 2 * 5 // 结果是 20
10 + (2 * 5) // 结果是 20
(10 + 2) * 5 // 结果是 60
小贴士: 在某些情况下,括号可能不是必需的,因为您可以依赖语言运算符优先级规则,但是仍然建议添加它们,因为这些规则取决于编程语言,并且对于以后阅读或修改代码的任何人来说清晰总是好的。
一些运算符在与不同数据类型一起使用时意义不同。例如,+
运算符可用于两个数字相加,连接两个字符串,求两个集合的并集,甚至为指针添加偏移量(如果具体的指针类型启用了指针运算):
10 + 2 + 11
10.3 + 3.4
'Hello' + ' ' + 'world'
然而,您不能像在 C 中那样做两个字符的加法。
div
是一个不寻常的运算符。在 Object Pascal 中,您可以使用 /
运算符除以任意两个数字(实数或整数),并且无论如何都会得到一个实数结果。如果需要除以两个整数并且想要一个整数结果,可以使用 div
运算符。以下是两个赋值的示例(随着我们在下一章中介绍数据类型,代码将变得更加清晰):
RealValue := 123 / 12;
IntegerValue := 123 div 12;
为确保整数除法没有余数,您可以使用 mod
运算符并检查结果是否为零,就像在以下布尔表达式中一样:
(x mod 12) = 0