Object Pascal 运算符

时间:2021-06-22 15:45:32
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 = ; {二进制表示: 11110000 11110000}
w2: Word = ; {二进制表示: 00001111 00001111}
var
w: Word; {not 运算, 只有一个运算数}
procedure TForm1.Button1Click(Sender: TObject);
begin
w := not w1; {not 就是按位(给二进制的每一位)取反}
{11110000 11110000 取反后就是:}
{00001111 00001111 }
ShowMessage(IntToStr(w)); {}
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)); {}
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)); {}
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 ; {shr 是按位右移, shr 1 是右移一位}
{w1: 11110000 11110000 右移一位后是:}
{w : *1111000 01111000 前面的*就是0了}
ShowMessage(IntToStr(w)); {} {同理, 可以移动几位, 譬如 3 位}
w := w1 shr ;
ShowMessage(IntToStr(w)); {} {w1 shr 3 相当与 w1 div 2的3次方}
w := w1 div ;
ShowMessage(IntToStr(w)); {}
end; {shl 运算, 只有一个运算数}
procedure TForm1.Button6Click(Sender: TObject);
var
i: Integer;
begin
w := w1 shl ; {shr 是按位左移}
{w1: 11110000 11110000 左移一位后是:}
{w : 1110000 111100000 }
ShowMessage(IntToStr(w)); {} {左移 3 位}
w := w1 shl ;
ShowMessage(IntToStr(w)); {} {w1 shl 3 相当与 w1 * 2的3次方}
w := w1 * ;
ShowMessage(IntToStr(w)); {} {注意这里有个问题: w1*8 以后怎么小了呢?}
{因为前面已经定义了 w 是 Word 类型的, 它的大小只有2个字节(二进制16位), 超出会忽略} {如果换成32位(4字节)的 Integer 类型, 肯定就会有真实的结果:} i := w1 shl ;
ShowMessage(IntToStr(i)); {} i := w1 * ;
ShowMessage(IntToStr(i)); {}
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:=;
p:=@int;
dispose(P);
end;
^:指针的引用解析操作符
符号 ^ 有两种用途,当它出现在类型标识符之前,如^typeName,表示一个类型,该类型表示指向typeName类型变量的指针;当它出现在指针变量之后,如pointer^,该符号对指针解除参照,也就是说,返回存储在内存地址(该地址保存在指针中)的值指针,指向的数据.
var
I: Integer;
PI: ^Integer;
begin
I :=
PI := @I;;
PI^ := ;
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;