Object Pascal 的运算符
运算符是程序代码中对各种类型的数据进行计算的符号,通常分为算数运算符、逻辑运算符、比较运算符和按位运算符。
1.算术运算符
Object Pascal 语言的算术运算符,如表1-9 所示。
表1-9 Object Pascal 语言算术运算符
操作符 | 操作 | 操作数据类型 | 结果类型 |
+ | 加 | 整型、实型 | 整型、实型 |
- | 减 | 整型、实型 | 整型、实型 |
* | 乘 | 整型、实型 | 整型、实型 |
/ | 除 | 整型、实型 | 整型、实型 |
mod | 取余 | 整型 | 整型 |
div | 整除 | 整型 | 整型 |
2.逻辑运算符
逻辑运算符操作对象和返回值都为布尔型,如表1-10 所示。
表1-10 Object Pascal 语言逻辑运算符
操作符 | 操作 | 操作数据类型 |
not | 非 | 布尔 |
and | 与 | 布尔 |
or | 或 | 布尔 |
xor | 异或 | 布尔 |
3.比较运算符
比较运算符返回值为布尔型(True 或False),关系运算符如表1-11 所示。
表1-11 Object Pascal 语言关系运算符
操作符 | 操作 | 操作数据类型 |
= | 等于 | 简单数据类型、指针、集合、字符串或字符串包 |
<> | 不等于 | 简单数据类型、指针、集合、字符串或字符串包 |
< | 小于 | 简单数据类型、指针、集合、字符串或PChar |
> | 大于 | 简单数据类型、指针、集合、字符串或PChar |
<= | 小于等于 | 简单数据类型、指针、集合、字符串或PChar |
>= | 大于等于 | 简单数据类型、指针、集合、字符串或PChar |
<= | 子集 | 集合 |
>= | 父集 | 集合 |
4.按位运算符
通过按位运算符可以修改一个变量的单独的位。可以进行按位与、或、非、异或,也可以对一个数进行向左(Shl)或向右(Shr)移位操作。Delphi 的按位运算符共有六个: not and or xor shr shl; 其中的 not and or xor 也叫逻辑运算符, 其实功能都是一样的, 因为不管什么数据追到底都是 0 和 1 的组合;在 Delphi 内嵌汇编中, 应该也没什么区别。
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} const w1: Word = 61680; {二进制表示: 11110000 11110000} w2: Word = 3855; {二进制表示: 00001111 00001111} var w: Word; {not 运算, 只有一个运算数} procedure TForm1.Button1Click(Sender: TObject); begin w := not w1; {not 就是按位(给二进制的每一位)取反} {11110000 11110000 取反后就是:} {00001111 00001111 } ShowMessage(IntToStr(w)); {3855} end; {and 运算, 需要两个运算数} procedure TForm1.Button2Click(Sender: TObject); begin w := w1 and w2; {and 就是把两个运算数按位对比, 如果相同(都是1或都是0)返回1; 不同返回0} {w1: 11110000 11110000 与} {w2: 00001111 00001111 每一位都不同, 所以返回:} {w : 00000000 00000000} ShowMessage(IntToStr(w)); {0} end; {or 运算, 需要两个运算数} procedure TForm1.Button3Click(Sender: TObject); begin w := w1 or w2; {or 就是把两个运算数按位对比, 只有其中一个是1就返回1; 都是0才返回0} {w1: 11110000 11110000 与} {w2: 00001111 00001111 or 后会返回:} {w : 11111111 11111111} ShowMessage(IntToStr(w)); {65535} end; {xor 运算, 需要两个运算数} procedure TForm1.Button4Click(Sender: TObject); begin w := w1 or w2; {and 就是把两个运算数按位对比, 只有两个不一样才返回1; 一样(都是0或都是1)则返回0} {w1: 11110000 11110000 与} {w2: 00001111 00001111 xor 后会返回:} {w : 11111111 11111111} ShowMessage(IntToStr(w)); {65535; 两个例数不太好, 没给 xor 和 or 区别明显} end; {shr 运算, 只有一个运算数} procedure TForm1.Button5Click(Sender: TObject); begin w := w1 shr 1; {shr 是按位右移, shr 1 是右移一位} {w1: 11110000 11110000 右移一位后是:} {w : *1111000 01111000 前面的*就是0了} ShowMessage(IntToStr(w)); {30840} {同理, 可以移动几位, 譬如 3 位} w := w1 shr 3; ShowMessage(IntToStr(w)); {7710} {w1 shr 3 相当与 w1 div 2的3次方} w := w1 div 8; ShowMessage(IntToStr(w)); {7710} end; {shl 运算, 只有一个运算数} procedure TForm1.Button6Click(Sender: TObject); var i: Integer; begin w := w1 shl 1; {shr 是按位左移} {w1: 11110000 11110000 左移一位后是:} {w : 1110000 111100000 } ShowMessage(IntToStr(w)); {57824} {左移 3 位} w := w1 shl 3; ShowMessage(IntToStr(w)); {34688} {w1 shl 3 相当与 w1 * 2的3次方} w := w1 * 8; ShowMessage(IntToStr(w)); {34688} {注意这里有个问题: w1*8 以后怎么小了呢?} {因为前面已经定义了 w 是 Word 类型的, 它的大小只有2个字节(二进制16位), 超出会忽略} {如果换成32位(4字节)的 Integer 类型, 肯定就会有真实的结果:} i := w1 shl 3; ShowMessage(IntToStr(i)); {493440} i := w1 * 8; ShowMessage(IntToStr(i)); {493440} end; end.
5.运算符优先级
一个表达式中可能有多个运算符,它们的运算是有先后顺序的,不同的运算符在表达式中的优先级如表1-12 所示。
表1-12 运算符的优先级
级别 | 运算符 |
第一级(最高级) | . ^ |
第二级 | @ not |
第三级 | * / div mod and as shl shr |
第四级 |
+ - or xor |
第五级(最低级) | = <> < > <= >= in is |
Delphi 的特殊符号
@:取址运算符
var int:integer; p:^integer; begin new(P); int:=24; p:=@int; dispose(P); end;
^:指针的引用解析操作符
符号 ^ 有两种用途,当它出现在类型标识符之前,如^typeName,表示一个类型,该类型表示指向typeName类型变量的指针;当它出现在指针变量之后,如pointer^,该符号对指针解除参照,也就是说,返回存储在内存地址(该地址保存在指针中)的值指针,指向的数据.
var I: Integer; PI: ^Integer; begin I := 10 PI := @I;; PI^ := 20; I := PI^; end;
取指针的方法,比如y:=p^; 就是指为Y赋值指针P
#:ASCII码值表示符;
const
tab_key=#9;//TAB键的ASCII值
$: 十六进制符
var pint:^integer; begin new(pint); showmessage(inttohex(integer(@pint),8)); pint^:=$ff; showmessage(inttohex(pint^,4)); end;