今天我们来看一下Delphi的运算符:
Delphi的运算符分为:@, not, and ^的一元运算符;*, /, div, mod, and, shl, shr, as, +, -, or, xor, =, >, <, <>, <=, >=, in, and is为二元运算符
一、赋值运算符
对于Pascal的新手来说,Delphi的赋值运算符和其它常用编程语言的赋值运算符不大一样,需要用:=来表示。例如:
- Number := 5;
二、比较运算符
对于Object Pascal来说,用=运算符来对两个表达式或两个值进行逻辑比较运算;用<>表示不等于运算符,这和其它语言用==、!=来表示有比较大的区别,新手比较容易搞错。
三、逻辑表达式
Pascal用and和or作为逻辑与和逻辑或的运算符,用not作为逻辑非的运算符。例如:
- if A and B then //逻辑与
- while A or B do //逻辑或
- if not A then //逻辑非
- A xor B //逻辑异或
- A shl B //A的二进制向左移动B位,尾数补零
- A shr B //A的二进制向右移动B位,首部补1
四、算术运算符
这里需要注意的是,在Pascal中,特意定义了针对整数除的运算符——div。在两个整数向楚时,自动截取余数取整;mod取余。主要使用在对整数操作中。x mod y = x - (x div y) * y;一个运行时错误是发生在当y为0时,对X/Y、X div Y、X mod Y的操作中。
五、位运算
在Pascal中的左移和右移是以shl和shr来表示的。
六、加减运算符
在Pascal中,提供了Inc()和Dec()来执行其它语言中++和--的操作。例如
- Inc(variable); //variable ++
- Dec(variable); //variable --
- Inc(variable,3); //variable+3
- Dec(variable,3); //variable-3
七、指针运算符
其中,关系运算符中的<, >, <=, and >=可以用来操作“PChar”、“PWideChar”类型。
+:将指针指向的地址增加偏移量;
-:将指针指向的地址减去偏移量;
^:1.取指针所指向地址中的内容(位于指针后);2.定义基类型的指针(位于基类型前面)
=:判断两个指针是否指向同一地址;
<>:判断两个指针是否指向不同地址;
如果P=Q为true,则表示P、Q指向同一个地址;+,-操作符用来增加或减少一个字符指针的偏移量。
八、集合运算符
+:集合并;
-:集合差;
*:集合交;
<=:左边集合是否包含于右边集合;
>=:左边集合是否包含右边集合;
=:左边集合是否等于右边集合;
<>:左边集合是否不等于右边集合;
In:左边集合是否与右边集合有从属关系;
例如:O in X+Y 相当于O在X或者Y中;O in X-Y相当于O只在X并不在Y中;O in X *Y相当于包含在X和Y中;X<=Y为真表示X的所有元素都包含在Y 内;O in S表示O是S的一个元素;
九、@运算符
@运算符返回一个变量、过程、方法或函数的地址。在用于方法时,必须用@TMyClass.DoSomething。
十、布尔运算符
布尔运算符有以下四个:not(非)、and(与)、or(或)、xor(异或)。
十一、字符串运算符
关系运算符中的“=”、“<>”、“<”、“>”、“<=”、“>=”都可以进行字符串操作,“+”用来进行字符串的连接。
十二、关系型运算符
关系型运算符用于比较两个操作数。其中=, <>, <=, and >=可以用于集合;= and <> 也可以用于指针;
I=J为true表示I和J的值相同;需要注意的是,1.这里的两个操作数必须是兼容的 并且可以相比;2.使用<>, <=, and >=来比较PChar和PWideChar时,其指针指向的数组内存地址必须相同。
十三、类运算符
类运算符包括as 和 is。
十四、运算符的规则
运算符以以下顺序执行:
- @, not first (highest)
- *, /, div, mod, and, shl, shr, as second
- +, -, or, xor third
- =, <>, <, >, <=, >=, in, is fourth (lowest)
十五、变量类型转换
- type Func = function(X: Integer): Integer;
- var
- F: Func;
- P: Pointer;
- N: Integer;
你可以进行以下操作
- F := Func(P); { Assign procedural value in P to F }
- Func(P) := F; { Assign procedural value in F to P }
- @F := P; { Assign pointer value in P to F }
- P := @F; { Assign pointer value in F to P }
- N := F(N); { Call function via F }
- N := Func(P)(N); { Call function via P }