2.0、运算符和表达式
运算符和表达式是Pascal语句的基本构成之一,其中运算符包括算术运算符、逻辑运算符、位运算符以及指针运算符,表达式依照结果的数据类型区分。
2.0.0、算术运算符
Delphi中提供加减乘除四则运算符,其中除法分为整数型除法(结果取截断整数)以及实数型除法,其中整数型除法使用“div”,实数型除法使用“/”。乘法使用符号“*”。比如:
a := 5 / 2; // 结果为2.5,类型为实数。
b := 5 div 2; //结果为2,类型为整数。
c := 3 * 2.5; //结果为7.5,类型为实数。
另外,Delphi还提供计算余数的运算符“mod”,计算结果为整数类型,比如:
d := 5 mod 2; //结果为1,类型为整数。
Delphi不提供乘方开放运算符,需要使用函数完成。
另外,有时候减号可以作为负号使用,当作为负号使用的时候,负号前不能够有其他数比如:
a := -2; // 如果负号前有其他数,那么作为减号使用。
b := 3 * -2; // 也可以在其他的运算符之后使用,负号将会优先被考虑。
2.0.1、逻辑运算符
与运算:当两个相与的表达式均为True时,结果为True,否则为False。符号为“and”。比如:
a := (1+3 = 4)and (7 div 5 = 1); // 结果为True,类型为布尔型(Boolean)。
或运算:当两个相或的表达式均为False时,结果为False,否则为True。符号为“or”,比如:
b := (7 / 2 =3.5) or (5 + 7 = -2); // 结果为True,类型为布尔型。
非运算:写在逻辑值或表达式之前,当逻辑值为Ture时,结果为False,符号为“not”。比如:
c := not (1 + 3= 4); // 结果为False。
异或运算:当两个相异或的表达式结果不同的时候,异或运算结果为True,否则为False,符号为“xor”。比如:
d := True xorFalse; // 结果为True。
e := False xorFalse; // 结果为False。
f := True xorTrue; // 结果为False。
2.0.2、位运算符
按位左移:按照二进制向左移位,相当于乘以2的次方,但是效率较高。符号为“shl”。比如:
a := 3 shl 4; //结果为48。
按位右移:按照二进制向右移位,相当于整数除以2的次方,但是效率较高。符号为“shr”。比如:
b := 48 shr 2;// 结果为12。
按位与:按照二进制,对每一位进行与操作,将1视为True,0视为False,将结果按二进制输出,符号为“and”。比如:
c := 5 and 4; //结果为4(101 and 100 = 100)。
按位或:按照二进制,对每一位进行或操作,将1视为True,0视为False,将结果按二进制输出,符号为“or”。比如:
d := 5 or 2; // 结果为7(101 or 010 = 111)。
按位取反:按照二进制,对每一位进行非操作,将1视为True,0视为False,将结果按二进制输出,符号为“not”。比如:
e := not 62; // 如果数据类型为Byte,则结果为193(not 00111110 = 11000001)。
按位异或:按照二进制,对每一位进行异或操作,将1视为True,0视为False,将结果按二进制输出,符号为“xor”。比如:
f := 12 xor 21;// 结果为25(01100 xor 10101 = 11001)。
指针运算符将在后续关于指针的章节中讲解。
2.0.3、表达式与运算符优先级
表达式由数据和运算符构成,由于表达式中不只有一个运算符,因此需要考虑运算符优先级的问题。
Delphi中运算符优先级如下:
1.单目运算符 (最高优先级)
@ 取变量或函数的地址(返回一个指针)
not 逻辑取反或按位取反
- 取负数
2.乘除及按位运算符
* 相乘或集合交集
/ 浮点相除
div 整数相除
mod 取模 (整数相除的余数)
as 程序运行阶段类型转换 (RTTI运算符)
and 逻辑或按位求与
shl 按位左移
shr 按位右移
3.加减运算符
+ 相加、集合并集、字符串连接或指针增加一个偏移量
- 相减、集合差集或指针减少一个偏移量
or 逻辑或按位或运算
xor 逻辑或按位异或运算
4.关系及比较运算符(最低优先级)
= 判断是否相等
<> 判断是否不相等
< 判断是否小于
> 判断是否大于
<= 判断是否小于或等于,或是否是一个集合的子集
>= 判断是否大于或等于,或是否是一个集合的父集
in 判断是否是集合成员
is 判断对象是否类型兼容 (又一个RTTI运算符)
运算符和表达式是Pascal语句的基本构成之一,其中运算符包括算术运算符、逻辑运算符、位运算符以及指针运算符,表达式依照结果的数据类型区分。
2.0.0、算术运算符
Delphi中提供加减乘除四则运算符,其中除法分为整数型除法(结果取截断整数)以及实数型除法,其中整数型除法使用“div”,实数型除法使用“/”。乘法使用符号“*”。比如:
a := 5 / 2; // 结果为2.5,类型为实数。
b := 5 div 2; //结果为2,类型为整数。
c := 3 * 2.5; //结果为7.5,类型为实数。
另外,Delphi还提供计算余数的运算符“mod”,计算结果为整数类型,比如:
d := 5 mod 2; //结果为1,类型为整数。
Delphi不提供乘方开放运算符,需要使用函数完成。
另外,有时候减号可以作为负号使用,当作为负号使用的时候,负号前不能够有其他数比如:
a := -2; // 如果负号前有其他数,那么作为减号使用。
b := 3 * -2; // 也可以在其他的运算符之后使用,负号将会优先被考虑。
2.0.1、逻辑运算符
与运算:当两个相与的表达式均为True时,结果为True,否则为False。符号为“and”。比如:
a := (1+3 = 4)and (7 div 5 = 1); // 结果为True,类型为布尔型(Boolean)。
或运算:当两个相或的表达式均为False时,结果为False,否则为True。符号为“or”,比如:
b := (7 / 2 =3.5) or (5 + 7 = -2); // 结果为True,类型为布尔型。
非运算:写在逻辑值或表达式之前,当逻辑值为Ture时,结果为False,符号为“not”。比如:
c := not (1 + 3= 4); // 结果为False。
异或运算:当两个相异或的表达式结果不同的时候,异或运算结果为True,否则为False,符号为“xor”。比如:
d := True xorFalse; // 结果为True。
e := False xorFalse; // 结果为False。
f := True xorTrue; // 结果为False。
2.0.2、位运算符
按位左移:按照二进制向左移位,相当于乘以2的次方,但是效率较高。符号为“shl”。比如:
a := 3 shl 4; //结果为48。
按位右移:按照二进制向右移位,相当于整数除以2的次方,但是效率较高。符号为“shr”。比如:
b := 48 shr 2;// 结果为12。
按位与:按照二进制,对每一位进行与操作,将1视为True,0视为False,将结果按二进制输出,符号为“and”。比如:
c := 5 and 4; //结果为4(101 and 100 = 100)。
按位或:按照二进制,对每一位进行或操作,将1视为True,0视为False,将结果按二进制输出,符号为“or”。比如:
d := 5 or 2; // 结果为7(101 or 010 = 111)。
按位取反:按照二进制,对每一位进行非操作,将1视为True,0视为False,将结果按二进制输出,符号为“not”。比如:
e := not 62; // 如果数据类型为Byte,则结果为193(not 00111110 = 11000001)。
按位异或:按照二进制,对每一位进行异或操作,将1视为True,0视为False,将结果按二进制输出,符号为“xor”。比如:
f := 12 xor 21;// 结果为25(01100 xor 10101 = 11001)。
指针运算符将在后续关于指针的章节中讲解。
2.0.3、表达式与运算符优先级
表达式由数据和运算符构成,由于表达式中不只有一个运算符,因此需要考虑运算符优先级的问题。
Delphi中运算符优先级如下:
1.单目运算符 (最高优先级)
@ 取变量或函数的地址(返回一个指针)
not 逻辑取反或按位取反
- 取负数
2.乘除及按位运算符
* 相乘或集合交集
/ 浮点相除
div 整数相除
mod 取模 (整数相除的余数)
as 程序运行阶段类型转换 (RTTI运算符)
and 逻辑或按位求与
shl 按位左移
shr 按位右移
3.加减运算符
+ 相加、集合并集、字符串连接或指针增加一个偏移量
- 相减、集合差集或指针减少一个偏移量
or 逻辑或按位或运算
xor 逻辑或按位异或运算
4.关系及比较运算符(最低优先级)
= 判断是否相等
<> 判断是否不相等
< 判断是否小于
> 判断是否大于
<= 判断是否小于或等于,或是否是一个集合的子集
>= 判断是否大于或等于,或是否是一个集合的父集
in 判断是否是集合成员
is 判断对象是否类型兼容 (又一个RTTI运算符)