建立表达式没有通用的方法,因为要取决于所用的运算符,Pascal包括有逻辑运算符、算术运算符、布尔运算符、关系运算符和集合运算符等等。表达式可用于确定赋给一个变量的值、计算函数或过程的参数、或者判断一个条件,表达式也可以包含函数调用。表达式是对一个标识符的值而不是标识符本身进行运算。
所有编程语言中的表达式都是常量、变量、数值、运算符和函数值的合法组合。表达式可以传递给过程或函数的值参,但不能传递给过程或函数中的引用参数。
如果你以前写过程序,那么你已经知道表达式是什么了。这里我专门讲一下 Pascal 运算符的特殊部分:运算符的优先级。表 2.2 中按优先级分组列出了 Pascal 语言的运算符。
与大多数编程语言相反,Pascal 语言中 and 和 or 运算符的优先级比关系运算符高。因此,如果你的代码为a < b and c < d,编译器首先会编译 and 运算符,由此导致编译出错。为此你应该把每个 < 表达式用小括号括起来: (a < b) and (c < d)。
同一种运算符用于不同数据类型时它的作用不同。例如,运算符 + 可以计算两个数字的和、连接两个字符串、求两个集合的并集、甚至给 PChar 指针加一个偏移量。然而,你不能象在 C 语言中那样将两个字符相加。
另一个特殊的运算符是 div。在 Pascal 中,你能用 / 计算两个数字(实数或整数)的商,而且你总能得到一个实型结果。如果计算两个整数的商并想要一个整型结果,那么就需要用 div 运算符。
表 2.2: Pascal语言中的运算符及其优先级
单目运算符(最高优先级) | |
@ | 取变量或函数的地址( 返回一个指针) |
not | 逻辑取反或按位取反 |
乘除及按位运算符 | |
* | 相乘或集合交集 |
/ | 浮点相除 |
div | 整数相除 |
mod | 取模(整数相除的余数) |
as | 程序运行阶段类型转换(RTTI 运算符) |
and | 逻辑或按位求和 |
shl | 按位左移 |
shr | 按位右移 |
加减运算符 | |
+ | 相加、集合并集、字符串连接或指针增加一个偏移量 |
- | 相减、集合差集或指针减少一个偏移量 |
or | 逻辑或按位或运算 |
xor | 逻辑或按位异或运算 |
关系及比较运算符(最低优先级) | |
= | 判断是否相等 |
<> | 判断是否不相等 |
< | 判断是否小于 |
> | 判断是否大于 |
<= | 判断是否小于或等于, 或是否是一个集合的子集 |
>= | 判断是否大于或等于, 或是否是一个集合的父集 |
in | 判断是否是集合成员 |
is | 判断对象是否类型兼容( 又一个RTTI 运算符) |
集合运算符包括并(+)、差(-)、交(*)、成员检测(in),及一些关系运算符。要把一个元素添加到集合中,你可以采用集合并运算。下面是一个选择字体的 Delphi 例子:
Style := Style + [fsBold];
Style := Style + [fsBold, fsItalic] - [fsUnderline];
另一种方法是利用标准过程 Include 和 Exclude,它们效率更高(但不能用于控件的集合类型属性,因为只能操纵一个元素):
Include (Style, fsBold);