Delpni基础2

在Object Pascal中,变量必须具有明确的数据类型。 数据类型决定了变量其值的集合以及所能参加
的运算。因此数据类型是非常重要,许多程序员最感头疼的也是数据类型。

Object Pascal支持丰富的数据类型,大致为分6大类;
(1)简单类型,包括有序类型和实型。
(2)字符串类型,包括短字符串类型、长字符串类型。
(3)构造类型,包括数组类型、文件类型、类、类引用、记录类型和集合类型等。
(4)指针类型。
(5)过程类型,把过程与函数看作一个对象。
(6)可变类型(Variant),其类型在运行期中是可变的。

下面分别进行详细介绍:

⒈简单类型

  ①有序类型概述:
 
有序类型的特点就是它的值总一个整数序数,其值域是有限的。
Object Pascal中共有12个预定义的有序类型:
Integer ShortInt SmallInt LongInt Byte Word Cardinal Boolean ByteBool WordBool LongBool char
还有2个用户自定义的有序类型:
Enumerated(枚举类型)
Subrange(子界类型)
对于有邓类型的数据,Object Pascal提供了一运行期函数,专门针对有序类型的数据操作,其中:
ord,返回一个数在其数集中的序号。
Pred,返回一个数在其数集中前一个序号的数。如果这个数已经是第一个数,并且进行范围检查的编
辑译开关{$R}在开的位置,将触发一个异常。
Succ,返回一个数在其数集中后一个序号的数,如果这个数已经是最后一个数,并且进行范围检查的
编译开关{$R}在开的位置,将触发一个异常。
Low,返回给定类型的数集中的最小值
High,返回给定类型的数集中的最大值。

  ②有序类型中的整型:
 
有序类型中的整型Integer实际上是所有有符号整型数的统称,Cardinal 实际上是所有无符号整型数
的统称,把一个变量声明为Integer或Cardinal,其字长和值域取决于CPU和操作系统,也就是说,在
不同的机器上或不同的操作系统下,可能是不的。请看下面的列表:

在16位的操作系统下(Windows 3.1),Integer和Cardinal的字长和值域分别是:
Integer: -32768..32767: 有符号16位
Cardinal: 0..65535: 无符号16位
在32位的操作系统下(Win9X),Integer和Cardinal的字长和值域  分别是:
Integer: -2147483648..2147483647: 有符号32位
Cardinal: 0..2147483647: 无符号32位
建议您尽量使用Integer和  Cardinal来声明变量
如果您相精确控制整数的字长和值域,您可以把变量声明为以下类型:
ShortInt: -128..127: 有符号8位
SmallInt: -32768..32767: 有符号16位
LongInt: -2147483648-2147483647: 有符号32位
Byte: 0..255: 无符号8位
Word: 0..65535: 无符号16位

当变量声明为以上5种类型时,其字长和值域独立于CPU和操作系统。
对整型数进行算术运算要特别注意数据的字长和值域,Object pascal规定:
对于整数常量,其精确类型是包含该值在内的值最小的类型。
两个不同的类型的操作数进行算术运算时,首先把它们转换成包含两种类型所有值在内的值域最小的
类型。
在赋值语句中,赋值号右边的表达式的计算独立于赋值号左边的变量的类型。
注意:您可以类型强制转换把一种整数类型转换成另一种整数类型(关于类型强制转换请参见)
对于整数常数,还可以用十六进制表示,表示方法是在数的前面加$符号,例如$10在十制进制中就是
16,$3C在十进制中就是60。

  ③有序类型中的布尔类型:
布尔类型主要用于关系运算和条件语句中,Object pascal中有四种布尔类型:

Boolean:1个字节: 只能是两个数0或1
ByteBool: 1个字节: 8位的有符号整数
WordBool: 2个字节: 16位的有符号整数
LongBool: 4个字节: 32位的有符号整数

对于Boolean来说,其值只能是0(False)或1(True),而ByteBool、WordBool和LongBool可以是有符号
的整数,值为0代表FALSE,非0值代表TRUE。

其中最常用的是Boolean类型,而ByteBool、WordBool和LongBool类型是为了与其它语言如 C/C++ 和
Windows环境兼容,因为 Windows的API在返回一个布尔值时,其值可能是一个两字节的有符号整数,
如果试图把返回值赋给Boolean类型的数据,编译器认为类型不匹配,如果进行类型强制转换,又可能
使返回值的有效数据被截断。

另外,Object Pascal规定:False小于True,Ord(False)等于0,Ord(True)等于1,Succ(False)等
于True,Pred(True)等于False。

  ④有序类型中的字符类型:
Char上是字符类型的统称,就像整型中的Integer一样,其精确类型分为AnsiChar和WidChar。

AnsiChar占一个字节,字符集包括扩展的ANSI字符.
WideChar占二个字节,字符集包括UniCode字符,头256个字符对应于ANSI字符。

如果把一个变量声明为Char,通常就是AnsiChar,但在某些CPU或操作系统下有可能是WideChar,因此
如果您的程序中必须用到的字符的字节数,最好先用
SizeOf函数取得。

Object Pascal提供了两个函数用于对字符类型操作:
Ord用于返回一个字符的序号。
Chr用于把一个整数转换成相应序号的字符。

这里还要介绍控制字符的概念,Object Pascal中可以用一个#后紧跟一个0到255的整数常数作为相应
ASCII码的字符,例如:

#0  表示ASCII码中序号为0的字符即空字符
#27  表示ASCII码中序号为27的字符即ESC。
您可以把控制字符作为普通字符和字符串结合在一起,例如:

'My Name Is '#49#49#49'Xu'。字符串中加了3个#49字符表示3个1。

注意:整数常数必须紧跟在#之后,中间不能有空格,另外如果几个控制字符作为字符串的一部分,控
制字符之间也不能有空格。

  ⑤简单类型中的实型:
实型不是有序类型,因为它的值域是无限的,实型类型的数据也叫实数,类似于C/C++中的浮点数。

Object Pascal中共有6种实数:

类型:有效位:字长
Real:11-12: 6
Single:7-8: 4
Double:15-16:8
Extended:19-20:10
Comp:19-20:8
Currency:19-20:8

其中,一般较常用的是Real,Single,Double

实数也可以用科学表示法表示,例如:
7E-2表示是7乘以10的负2次方,其中7称为尾数部分,-2称为指数部分。
12.25e+6或12.25e6表示是12.25乘以10的6次方。
使用科学表示法要注意:指数必须为整数,可以为正也可以为负,即使尾数为1,也不能省略,如写
成E-2就是错误的的。

  ⑥枚举类型:
枚举类型和子界类型不同于标准的简单类型,标准的简单类型如整型和实型等,其字长和值域以及所
能参加的运算都已由 Object Pascal语言预先定义好,程序员不必再进行类型描述。而枚举类型和子
界类型则是由用户自定义的,同样是枚举类型,如果类型描述不同,这个类型的数据所表示出来的特
性也不同。

所谓枚举类型,就是用一组数量有限的标识符来表示一组连续的整数常数,使用枚举类型能够更清晰
地表示出现实世界。例如:一个星期有7天,  程序中分别用0、1、2、3、4、5、6来表示一个星期的
每一天,当然也可以,但程序很不直观,也许您在相,用常量来表示不也可以吗,是的,不过用枚举
类型有其独一之处。

声明一个枚举类型的语法是这样的:

变量名=(枚举列表)
枚举列表:标识符1,标识符2…标识符n

其中标识符列表中的标识符彼此之间用逗号隔开,它列出了枚举类型所能取值的范围,也就是说,一
个枚举类型的变量,其值总是所列的标识符列表中的一个,这也是这种类型之所以叫枚举类型的原
因,这是枚举类型的一个特点。例如:

Type

       DayOfWeek=(Sun,Mon,Tue,Wed,Thu,Fri,Sat);

Object Pascal规定,第一个标识符的值为0,第二个标识符的值为1,依次类推。

注意:上例中只是声明一个枚举类型DayOfWeek,但类型不能直接在程序中参加运算的。就好像Inte-
ger类型一样,您还必须声明一个DayOfWeek类型的变量,
例如:

Var MyDays:DayOfWeek;

这样就声明了一个DayOfWeek类型的枚举变量MyDays,  MyDays的值总是标识符列表中的一个。

当然,为了简化程序,您可以把类型声明和变量声明合二为一,例如:

Var MyDays:(Sun,Mon,Tue,Wed,Thu,Fri,Sat);

声明枚举类型和枚举变量时要注意:

枚举的元素只能是标识符,标识符的命名必须符合 Object Pascal关于标识符的规定,例如下面的声
明就是错误的:

Type DayOfWeek=(0,1,2,3,4,5,6,7);(标识符不能以数字打头)
Type DayOfWeek=(For,Of,End,Do)(标识符不能是保留字)

同一个枚举元素不能同时出现在多个枚举中,例如:

Type Colors=(Red,Blue,Green,White,Black);
AnotherColors=(Yellow,Line,Silver,Green);

上面的两个类型中都有Green元素,这是不允许的。

不能用直接用枚举元素参加运算,以枚举类型变量MyDays为例,程序中如果出现

X:=Fri*4;

这是错误的,您只能用某个枚举元素对枚举变量赋值,例如:

MyDays:=Fri;

Object Pascal中提供了几个标准的函数用于对枚举变量进行操作, 其中Pred函数用于返回指定元素的
前一个元素,Succ函数用于返回指定元素的后一个元素,例如(以MyDays变量为例):

Pred(Fri)等于Thu,Succ(Sun)等于Mon。

另外还有个函数Ord用于返回指定的枚举元素的值(序号),例如:Ord (Wed)等于3

  ⑦子界类型:
枚举类型的特点在于它的值是屈指可数的,而子界类型的特点在于它的值总是在一个区间内(把值全部
罗列出来可能有困难)。

声明一个子界类型的语法是这样的
子界类型=下界常数..上界常数

其中下界常数和上界常数的类型必须是同一种有序类型,如整型、布尔型、字符型、还可以是枚举型,但
不能是实型,这两个常数的类型也称为子的宿主类型。

程序示例如下:

Type Letters='A'..'Z';
       Month=1..12;

子界的宿主类型也可以是枚举型,不过在声明宿主类型为枚举型的子界类型之前必须先声明一个枚举类
型,例如:

Type Month=(Jan,Fed,Mar,Apr,May,Jun,Jul,Ang,Sep,Oct,Nov,Dec);{声明一个枚举类型}
       Months=Jan..Dec;{声明一个子界类型}

跟枚举类型一样,类型是不能直接参加运算的,还必须声明一个子界类型的变量,例如:

Var MyMonths:Months;

为了简化程序,您也可以把类型声明和变量声明合二为一,如:

Var MyLetters:'A'..'Z';

声明和使用子界类型要注意这么几点:

上界常数和下界常数的类型必须一致,且都是有序类型。
子界型变量所以参加的运算可参照它的宿主类型。
子界型变量的取值是有一个范围的,如果运算过程中超出这个范围将导致程序出错。

Delphi的文档中提到:子界型的上界和下界也可以是表达式。


⒉字符串类型的介绍
Object Pascal的字符串类型分为短字符串和长字符串两种。

所谓短字符串,是指字符串长度最大不超过255个字符的字符序列,当编译开关的状态为{$H-}时,用
保留字String声明的是一个短字符串,不管编译开关$H在什么状态,用ShortString声明的变量总是
短字符串类型,程序示例如下:

Var MyString1:ShortString;
Var MyString2:String[100];

上例中,保留字String后有方括号括起来的无符号整数,表示字符串的最大长度是100。当把一个字符
串赋给一个短字符串类型的变量时,超过其最大长度的部分将被截掉。

短字符串中的每一个字符可以通过字符串名加字符索引来访问,注意,尽管索引是从0开始的,但索引
0处的字符存放的是字符串的实际长度,也就是说调用Ord(S[0])相当于调用Length(S)。真正的字符是
从索引1处开始的。

由于短字符串的长度是动态变化的,您可以使用Low和High函数取得字符串的最大序号和最小序号,Low
的返回值当然是0,而high的返回值就是声明的字符串的最大长度。

短字符串类型主要是为了与早期Delphi版本兼容,在Delphi1。0 中,没有长字符串的概念。

所谓长字符串,其长度几乎是无限制的,理论上可达到2GB,实际上只受计算机的内存限制。要声明一
个长字符串,就要用预定义的标识符AnsiString或把编译开关$H的改为{$H+}(缺省)后用保留字
String来声明。

同短字符串相比,除了最大长度可以大得多以外,长字符串在声明以后自动被初始化为空字符串(与
字符变量是全局的还是局部的无关),另外要访问长字符串中的每个字符,是从索引1处开始的,长字
符吕没有索引为0的字符,要取得长字符串的实际长度,只能调用Length函数。

长字符串还有个特点,就是长字符串在它最后一个字符后自动加一个NULL字符表示字符串结束(注意:
NULL字符并不是长字符串的一部分),这一点有点跟字符指针类型(Pchar)相似,这样您就可以很方便
地把一个长字符串类型强制转换成Pchar类型,语法Pchar(S),其中 S  是长字符串表达式,这样长字
符串就被转换为一个指针,指向长字符串的第一个字符, 即使长字符串是空的,强制转换后总是能获
得一个指向以NULL字符结束的字符中的指针。

以NULL结束的字符串主要用于跟Windows的API或其它语言的例程兼容,请看下面的例子:

假设Caption和Message都是长字符串,

Caption:='Hello World';
Message:='This is a test of long string';
MessageBox(0,Pchar(Message),Pchar(Caption),MB_OK);

您还可以把一个长字符串强制转换成一个无类型的指针,语法是Pointer(S),其中S是长字符串表达式,
转换后的结果是指向第一个字符地址的指针,与用Pchar强制转换不同的是,如果长字符串是空的,转
换后的结果就是nil。

一般地,不管是用Pchar还是Pointer,转换获得的指针所指向的字符串通常是作为只读的字符串传输给
Windows的API或其它语言写的例程。

Object Pascal允许字符串和长字符串混合出现在同一个表达式中,编译器会自动需要进行类型转换。

最后要注意:字符串变量必须用一对单引号括起来,如果字符串中本身就有单引号,这个单引号要用两
个连续的单引号表示,例如:

'His Name Is ''Fang'''


这一章节到此结束,下一章节我将讲述:构造类型 和 指针类型


附录一:Object Pascal 语言中的所有关键词(Keywords)和保留字(reserved words)
★此表由意大利著名DELPHI作家:Marco Cantù提供★
我没有把“作用”翻译成中文,是想让大家更深入的了解这些词在DELPHI中的出现位置。

  Keyword                                 Role
absolute                      directive (variables)
abstract                      directive (method)
and                           operator (boolean)
array                         type
as                            operator (RTTI)
asm                           statement
assembler                     backward compatibility (asm)
at                            statement (exceptions)
automated                     access specifier (class)
begin                         block marker
case                          statement
cdecl                         function calling convention
class                         type
const                         declaration or directive (parameters)
constructor                   special method
contains                      operator (set)
default                       directive (property)
destructor                    special method
dispid                        dispinterface specifier
dispinterface                 type
div                           operator
do                            statement
downto                        statement (for)
dynamic                       directive (method)
else                          statement (if or case)
end                           block marker
except                        statement (exceptions)
export                        backward compatibility (class)
exports                       declaration
external                      directive (functions)
far                           backward compatibility (class)
file                          type
finalization                  unit structure
finally                       statement (exceptions)
for                           statement
forward                       function directive
function                      declaration
goto                          statement
if                            statement
implementation                unit structure
implements                    directive (property)
in                            operator (set) - project structure
index                         directive (dipinterface)
inherited                     statement
initialization                unit structure
inline                        backward compatibility (see asm)
interface                     type
is                            operator (RTTI)
label                         declaration
library                       program structure
message                       directive (method)
mod                           operator (math)
name                          directive (function)
near                          backward compatibility (class)
nil                           value
nodefault                     directive (property)
not                           operator (boolean)
object                        backward compatibility (class)
of                            statement (case)
on                            statement (exceptions)
or                            operator (boolean)
out                           directive (parameters)
overload                      function directive
override                      function directive
package                       program structure (package)
packed                        directive (record)
pascal                        function calling convention
private                       access specifier (class)
procedure                     declaration
program                       program structure
property                      declaration
protected                     access specifier (class)
public                        access specifier (class)
published                     access specifier (class)
raise                         statement (exceptions)
read                          property specifier
readonly                      dispatch interface specifier
record                        type
register                      function calling convention
reintroduce                   function directive
repeat                        statement
requires                      program structure (package)
resident                      directive (functions)
resourcestring                type
safecall                      function calling convention
set                           type
shl                           operator (math)
shr                           operator (math)
stdcall                       function calling convention
stored                        directive (property)
string                        type
then                          statement (if)
threadvar                     declaration
to                            statement (for)
try                           statement (exceptions)
type                          declaration
unit                          unit structure
until                         statement
uses                          unit structure
var                           declaration
virtual                       directive (method)
while                         statement
with                          statement
write                         property specifier
writeonly                     dispatch interface specifier
xor                           operator (boolean)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值