ObjectPascal语言的语法基础_第1页
ObjectPascal语言的语法基础_第2页
ObjectPascal语言的语法基础_第3页
ObjectPascal语言的语法基础_第4页
ObjectPascal语言的语法基础_第5页
已阅读5页,还剩252页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第2章章 object pascal语言的语法基础语言的语法基础2.1 符号集符号集2.2 语句语句2.3 常用函数与过程常用函数与过程2.4 异常处理异常处理2.5 小结小结习题二习题二2.1 符 号 集任何一种程序设计语言都具有自己的符号集。符号集由字母、数字、特殊字符、关系运算符、赋值运算符等组成。2.1.1 字符集字符集object pascal语言的字符集使用的是ascii码的字符集,它包括英文字母、数字、特殊字符和字符组合作为特殊符号等。1英文英文包括26个大小写英文字母,即“az”和“az”。2数字数字包括09这10个数字。3特殊字符除了英文字母和数字外的其他字符都属于特殊字符

2、。(1)可见的特殊字符。 1)单个字符作为特殊符号:如+ - * / # $ & ( ) = : ; .。 2)字符组合作为特殊符号:是指由两个字符组成并表示一定的特殊意义,如/ = := (. .) “” (* *)。(2)不可见的特殊字符。空格字符(ascii码值为32)和不可见的ascii控制字符(ascii码值为031),常见的有“enter”符,其ascii码值为13。其中,有些字符是等价的,例如:“”等价于“(*”,“”等价于“*)”,“”等价于“(”,“”等价于“)”。注意:(1)object pascal语言对英文字母的大小写不敏感,即“a”等价于“a”,但是字符串中的

3、大小写字母应该区分清楚。一般是将标识符的首字母大写,其余的小写。(2)! “ % ? _ | 不属于特殊字符。2.1.2 标识符标识符标识符(identifiers)是用来表示常量、常数、类型、属性、过程、函数、单元和程序等语法成分的符号。标识符分为标准标识符和用户自定义标识符两类。1标准标识符标准标识符具有一定的意义,是事先分配给标准类型、标准常量、标准过程、标准函数和标准文件使用的标识符。(1)标准类型:integer,string,char。(2)标准常量:true,false。(3)标准过程:get,pack,put。(4)标准函数:abs,spr,sin,cos,date。(5)标准

4、文件:output,input。2用户自定义标识符用户根据程序的需要可以自定义标识符,如常量、变量、过程和函数,用户自定义标识符须注意以下几点:(1)必须由字母或者下划线开头,后跟字母、数字或者下划线。(2)标识符的长度可以是任意的,但只有前255个字符有效。(3)标识符中不允许有空格符。(4)标识符的定义尽可能地避免与标准标识符相同,不能与保留字相同。正确的标识符:d122,d122d,_122ddd,_dd_122和dd_122等。错误的标识符:122dd,122_dd,dd 122,dd122和dd等。2.1.3 保留字与命令符保留字与命令符保留字与命令符是delphi保留的完成特定功能

5、的字符串。1保留字保留字是系统规定的具有特殊意义、特殊用途的字符串,它不能被用户重新定义或者作为其他标识符使用。object pascal语言中的保留字如表2.1所示。表2.1 object pascal语言中的保留字除了上述的保留字外,在对象定义类型时,private,protected,public,published和automated也可作为保留字,而其他情况下作为命令符。2命令符命令符又称为指令字。命令符和保留字的区别是命令符只有在特殊的情况下才有意义,一般情况下可以被用户定义为变量使用,程序不会出现错误,但是程序的条理不清晰。object pascal语言中的命令符如表2.2所示。

6、表2.2 object pascal语言中的命令符2.1.4 常量和变量常量和变量在一段程序中,有两种不同类型的数据,即常量和变量。它们的区别是在程序执行过程中其值是否发生改变。1常量常量是在程序执行过程中其值一直保持不变的量。使用常量的好处是代码简洁、修改代码容易。常量可分为直接常量、符号常量和类型常量。(1)直接常量:在程序中直接引用的常数,如整型常数、实型常数、字符型常数、字符串型常数和布尔型常数。 1)整型常数即整数,包括正整数、负整数和零。如2005,+2005,2005。 2)实型常数即实数,包括定点实数和浮点实数。定点实数即带有小数点形式的实数,如0.005,0.325,25.3

7、2,+25.32,0.0;浮点实数即以科学计数形式表示的实数,如5.68e13,+2.65e+3, 6.255e5。 3)字符型常数是由单撇号“”括起的字符,如f ,f,2,#。 4)字符串型常数是由单撇号“”括起的字符串,如delphi,delphi 8.0和程序设计。 5)布尔型常数仅有两个值,即true和false。true表示逻辑判断的结果为真;false表示逻辑判断的结果为假。(2)符号常量:它是以标识符形式出现的常量。使用符号常量可以使程序简洁,修改容易。如果在一段程序中同一个常数反复出现,此时可以定义一个标识符来表示此常数,这个标识符称为符号常量。定义常量的语法格式如下:cons

8、t常量名1=常量值1;常量名n=常量值n;其中,const是常量声明的保留字,是常量定义字段的开始;常量名是常量的标识符,即常量的名称;常量值是直接常量或者自定义符号常量组成的表达式。例如:const x=15; y=x+3; message=我喜欢delphi;注意:(1)保留字const可以单独成行,也可以写成const x=15;。为了使程序的结构更加清晰,建议使用第一种书写形式。(2)在程序中不可以给常量赋值,否则delphi编译器将出错。(3)类型常量:具有数据类型的符号常量称为类型常量,其类型可以定义为标准数据类型或高级数据类型。定义类型常量的语法格式如下:const常量名:类型名

9、=常量值;例2.1 常量的声明。程序代码如下:const pi:real=3.14; max:integer=89555; dd:string4=name;2变量变量是程序的最基本要素之一,变量是在程序执行过程中其值可以改变的量。它是程序中某个内存地址的标识符,变量中可以存放数值、字符和字符串等。(1)变量的组成。 1)变量名:即变量的标识符,调用变量时直接调用变量名。 2)变量类型:字符型、字符串型和整型等。 3)变量值:即某一变量所代表的内存单元中的数据值。(2)变量的声明。变量声明的基本语法格式如下:var变量名1:类型名1;变量名n:类型名n;其中,var是变量声明的保留字;变量名是变

10、量的标识符,即变量名称;类型名是任何有效的数据类型。例如:var x:integer; y:double; z:string;当定义多个相同类型的变量时,定义的语法格式如下:变量名1,变量名2,变量名n:类型名;变量名之间用逗号隔开。例如:var a,b,c:integer;一般情况下,变量声明要使用保留字var。但有时在类中声明变量时可以不使用保留字var。例2.2 变量声明不需要保留字var。程序代码如下:type tform1 = class(tform) button1: tbutton; edit1: tedit; procedure formcreate(sender: tobje

11、ct); procedure button1click(sender: tobject); private d:string; /此处定义变量不需要保留字var private declarations public public declarations end;(3)变量的使用。在程序中变量必须先声明,后使用。通常先定义变量,然后初始化变量,初始化变量即给变量赋值,然后在程序中使用变量。变量初始化的一般格式如下:var 变量名:类型名=常量表达式;例如:vari:integer=12; /变量声明i,并初始化为12(4)变量的作用域。变量的作用域是指变量的作用范围。根据作用域范围的类别变量

12、分为公有变量与私有变量、全局变量与局部变量。 1)公有变量与私有变量。在单元接口(interface)部分声明的变量属于公有变量,可以被其他单元引用。如果某些变量从一个单元传到另一个单元,则需要用公有变量。在单元的实现(implementation)部分声明的变量属于私有变量,此变量只能在本单元中使用,不能被其他单元引用。 2)全局变量与局部变量。全局变量又称为全程变量,作用域是整个程序。在子程序之前,单元的实现部分之后声明的变量可以为本单元任何一个子程序使用。而局部变量是在一定区域范围内使用的变量,如果一个子程序使用,则其他子程序不能使用。全局变量占用内存空间时间较长,贯穿了整个程序的始终;

13、局部变量则随着子程序运行的结束而释放内存空间。所以在一般情况下,不要把变量定义为全局变量。例2.3 公有变量与私有变量,全局变量与局部变量的应用。单元文件1的程序代码如下:unit unit1;interfaceuses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, borland.vcl.stdctrls, system.componentmodel; var name1:string;/公有变量可以在单元2中使用,name是命令符,所以定义变量使用name1type t

14、form1 = class(tform) edit1: tedit; button1: tbutton; procedure button1click(sender: tobject); private private declarations public public declarations end;var form1: tform1;implementationuses unit2;/引用unit2 var sex:string; /全局变量$r *.nfmprocedure tform1.button1click(sender: tobject); var age:integer;/

15、局部变量begin name1:=edit1.text ;/把输入的值赋给变量name1 form2.show ;end;end.单元文件2的程序代码如下:unit unit2;interfaceuses windows, messages, sysutils, variants, classes, graphics, controls, forms, dialogs, system.componentmodel, borland.vcl.stdctrls;type tform2 = class(tform) button1: tbutton; label1: tlabel; procedur

16、e button1click(sender: tobject); private private declarations public public declarations end;var form2: tform2;implementationuses unit1;/与公有变量name1配合使用$r *.nfmprocedure tform2.button1click(sender: tobject);beginlabel1.caption :=name1;/调用单元1中的变量并显示end;end.注意:当全局变量和局部变量重名时,局部变量的优先级高于全局变量。在局部变量使用的范围内,程

17、序使用局部变量则不使用全局变量。2.1.5 数据类型数据类型数据是描述客观世界的字符、数字和所有输入到计算机中并能被程序加工、运算的符号集。数据类型是描述变量的表示形式和取值范围及数据能够参加的各种运算。在object pascal语言中变量声明必须确定变量的类型。在object pascal语言中,用户可以根据需要定义自己需要的数据类型。object pascal语言具有丰富的数据类型,包括简单类型、结构类型、指针类型、过程类型、可变类型,如图2.1.1所示。1简单类型简单类型可分为有序类型、实数类型、字符串类型和日期时间类型四大类。(1)有序类型又包括整数类型、字符类型、布尔类型、枚举类型

18、和子界类型。 图2.1.1 数据类型 1)整数类型:它是全体整数的统称,包括所有的正整数、负整数和零。整数类型可分为基本整数类型和通用整数类型。 基本整数类型包括shortint,smallint,longint,int64,byte,word和longword等类型,基本整数类型的名称、类型、长度和取值范围如表2.3所示。表2.3 基本整数类型通用整数类型包括integer和cardinal两种。它们的长度都是32位,其区别是integer类型表示有符号整数;cardinal类型表示无符号整数。通用整数类型的名称、类型、长度和取值范围如表2.4所示。表2.4 通用整数类型不同的整数类型占用内

19、存空间的大小也不同,所以在定义整数变量时要根据自己的需要选择合适的整数数据类型,定义的太小将出现内存溢出,太大会造成内存空间的浪费。例如,编一个循环10次的程序,用byte类型定义变量就足够了。适用于整数类型的运算如下:算术运算:+,*,div,mod。关系运算:=,=,。在delphi中,不同变量类型之间的运算有可能出错,当位数少的向位数多的方向赋值时不会出错,反过来就要出错。例2.4 变量声明的应用。程序代码如下:procedure tform1.button1click(sender: tobject);var i:integer;/定义i是整型变量 j:byte;/定义j是字节型变量b

20、egin j:=255; i:=j;/不会出错 i:=5985;j:=i;/超出了j的取值范围,出错end; 2)字符类型:所有ascii码都属于字符类型,一般的字符只占用1个字节的内存空间。字符类型可分为ansichar和widechar。ansichar是单字节字符,占用1个字节,它是ansi字符集中的字符;widechar占用2个字节的空间(即16位),是unicode字符集中的字符。char是一般字符类型,即通用类型。在不同的cpu和不同的操作系统下占用的内存空间不同,可能是1个字节,也可能是2个字节。字符数据类型的名称、类型、长度和取值范围如表2.5所示。ansi字符集是ascii字

21、符集的扩展,每个字符占用1个字节,即8位。unicode字符集中前256个字符是ansi字符集,最常用的字符类型是char类型。表2.5 字符数据类型适用于字符类型的运算符如下:关系运算:=,=,。 3)布尔类型:它是最简单、最常用的数据类型之一,用于逻辑运算,布尔类型的值等于两个预先定义的常量标识符true,false。布尔类型可分为3种基本类型,即bytebool,wordbool和longbool,其通用类型是boolean。布尔数据类型的名称、类型、长度和取值范围如表2.6所示。bytebool和boolean类型占用内存空间为1个字节;wordbool类型占用内存空间为2个字节;lo

22、ngbool类型占用内存空间为4个字节。在一般编程时最好使用boolean,而bytebool,wordbool,longbool主要用于其他语言和windows环境兼容。表2.6 布尔数据类型适用于布尔类型的运算符如下:关系运算:=,=,。逻辑运算:and,or,not。关于布尔数据类型的逻辑运算,例如,设a,b是两个变量,两者之间进行的逻辑运算结果如表2.7所示。表2.7 a,b逻辑运算 4)枚举类型:它是通过列举表示其值的标识符来定义的有序集合。有时需要变量引用一个固定集合中的值,如一周七天,week可以表示sunday,monday,tuesday,saturday。此种情况就要用枚举

23、类型。使用枚举类型用户可以定义一组具有特殊意义的值,最多可定义255个子项。枚举类型的定义格式如下:type类型定义符=标识符1,标识符2,标识符n;其中,type是定义枚举类型的保留字;类型定义符是枚举变量的名称;标识符1,标识符n是自定义的一组有意义的标识符,且n必须小于等于255。例如:type week=(sunday,monday,tuesday,wednesday,thursday,friday,saturday);week被定义为枚举类型,括号中的值称为枚举常量。即可以使用枚举类型week定义变量。例如:var d:week;/定义d是week类型的变量也可以同时定义枚举类型和变

24、量声明。例如:var d:(sunday,monday,tuesday,wednesday,thursday,friday,saturday); d:=sunday; /对枚举类型变量d赋值注意:枚举类型不能进行输入、输出操作。 5)子界类型:它是在有序类型的取值范围内重新定义部分取值范围。枚举类型需要把所有的项逐一写出来,当数量较少时不太复杂,而当数量较多时枚举类型非常烦琐。例如,定义1100之间的整数,使用枚举类型:1,2,3,100,要写100个数,这不是用户所想要的。此种情况用子界类型定义非常简单,子界类型的定义格式如下:type 子界类型=常量下界.常量上界;var 子界类型变量:子

25、界类型;其中,常量下界和常量上界必须是同一种有序类型,常量下界要小于等于常量上界,下面通过一个例子来说明子界类型。例如:type num=1.15; letter=a.z;var i:num;因此,子界类型必须要求是有序类型,如整型、布尔型、字符型、枚举型等。而无序类型不能作为子界类型的元素。对num赋值应为在115之间的整数,超出这个范围编译器将提示出错。(2)实数类型:又称为浮点类型,包括整数部分和小数部分。实数不是有序类型,因为它的值域是无限的,主要用于数值较大或者精度较高的运算。运算时占用大量的cpu资源,运算的速度也低于整型。实数类型包括以下几种基本类型,double,real48,

26、single,extended,currency和real,它们之间的区别主要是取值范围、占用空间的大小不同。实数类型的类型、名称、取值范围、有效数字和长度如表2.8所示。表2.8 实数类型除此之外,还有comp也属于实数类型,但很少使用。其中double,real48,single,extended,currency为基本类型;real为一般类型。注意:(1)extended类型比real类型的精度高,但是它与其他语言或者操作平台的兼容性较差,尽可能的避免使用。(2)real类型与double类型是等价的。(3)currency类型是专为财务货币处理设计的,此类型至少有4位有效小数位。(3)

27、字符串类型:它是存储字符串数据的类型,可分为shortstring,ansistring,widestring和string,字符串类型的类型、名称、最大长度和所需的内存空间如表2.9所示。表2.9 字符串类型其中,shortstring,ansistring,widestring是基本字符类型;string是一般字符类型,即通用类型。当编译开关的状态为$h-时,用保留字string声明的是短字符串,即shortstring;当编译开关的状态为$h+时,用保留字string声明的是长字符串,即ansistring。在默认情况下,编译开关的状态为$h+。字符串变量声明的语法格式如下:var 类型

28、标识符:string长度;在程序中一般使用string,很少使用shortstring,ansistring和widestring来声明字符串变量。例如:var str1:string; str2:string10;其中,可以通过字符串的下标来访问字符串中的字符,10是限制字符串的长度不能超过10,如果赋初值时字符串的长度超过了10,则系统自动识别前10位,剩余的字符将被丢失,但是ansistring和widestring类型的字符串没有长度的限制。例2.5 超过定义字符串范围的长度将被丢失的应用。程序代码如下:procedure tform1.button1click(sender: tob

29、ject);var str:string2;begin str:=asdjgh; /给str赋值 label1.caption:=str;end;执行这段程序后结果是as。说明变量str把字符串asdjgh中的后4位数据“djgh”丢失。在一段程序中如果字符串变量str赋的值是汉字,则用str来显示其字符可能是乱码,下面通过一个例子说明这个问题。例2.6 输出“我喜欢delphi”的第一个字节。程序代码如下:procedure tform1.button1click(sender: tobject); var str:string10;begin str:=我喜欢delphi;/给str赋值

30、label1.caption:=str1;end;执行这段程序显示的不是“我”,而是乱码,可改为下面的程序:procedure tform1.button1click(sender: tobject); var str:string;begin str:=我喜欢delphi ;/给str赋值 label1.caption:=str1;end;执行这段程序后显示字符“我”。(4)日期时间类型:该类型是delphi常用的一种类型,用来存储、控制日期和时间,和日期时间类型相似的是日期类型和时间类型。日期时间类型实际上是浮点类型的一种,在变量中存储年、月、日、小时、分和秒这些信息。声明一个日期时间型的

31、变量和声明其他变量类似。例如:var mydatetime:datetime;例2.7 日期时间类型的应用。程序代码如下:procedure tform1.button1click(sender: tobject); var my:datetime;/定义变量begin my:=now();/获取系统日期时间 label1.caption:=datetimetostr(my);/显示系统日期时间end;这段程序的作用是显示当前系统的日期时间。其中,now()是获取系统日期时间的函数,而datetimetostr()是将日期时间类型转换成字符类型。2结构类型结构类型比简单类型的数据复杂,结构类型

32、在程序中也是非常重要的。它包含很多类型,下面重点介绍集合类型、数组类型和记录类型。(1)集合类型:它是把一组相关的对象作为一个整体参加运算,每一个对象称为集合的一个元素。这点和枚举类型、子界类型类似,但是它们之间也有区别,集合类型是一个整体,而枚举类型和子界类型的变量只是它的一个元素;集合类型中元素没有先后顺序关系,相同的元素不能在同一个集合中出现。 1)定义集合类型。其类型的格式如下:type 集合标识符=set of 基本类型;其中,集合元素的个数不能超过256个字符,type,set of是保留字;基本类型可以是任意有序类型,如整数类型、字符类型、布尔类型、枚举类型和子界类型,但不能是实

33、数类型。例如:type num=set of 1.10;/以子界类型为基类 mychar=set of char;/以字符类型为基类 orient=(east,west,south,north);/以枚举类型为基类需要注意的是在使用集合类型时,要先定义集合类型,集合类型的变量声明与其他类型变量的声明类似。例如:var mynum:num;也可以同时声明集合类型和变量。例如:var mynum:set of 1.10;注意:集合中元素上界应大于等于下界,集合元素的个数不能超过256个字符,如mychar=set of widechar;是错误的,因为widechar的位数为2,包含65 535个

34、字符。 2)集合类型变量赋值。给集合类型变量赋值时用方括号表示。例如:type num=set of 1.10;var mynum:num;begin mynum:=1,2,3,4,5;end;先定义了集合类型num,然后声明集合变量,最后给它赋值。其中mynum是num的类型变量,集合类型允许值为空集,如mynum:=;。 3)集合类型的运算。该运算包括等于“=”与不等于“”关系运算,集合类型的关系运算返回结果是布尔值:真或假,元素的排列顺序和集合没有关系。例如:1,2,3,4=2,3,4,1;/真(true)1,2,3,4=2,3,4,5;/假(false)小于等于“=”关系运算,集合a中

35、的元素在集合b中都存在,称为集合a小于等于集合b,反之称为集合a大于等于集合b。例如:a, b, c= a, b, c, d;/真(true)c, b, a= a, b, c, d;/假(false)注意:集合的运算关系不存在大于、小于,只存在大于等于和小于等于。(2)数组类型:该类型是一组具有相同类型的元素并按一定的顺序组成的序列。数组中的每一个元素都通过数组名和下标来存取。数组可分为一维数组和多维数组,也可分为静态数组和动态数组。 1)一维数组:它是数组中最简单的数组,定义一个一维数组类型的格式如下:数组标识符=array下标号下限.下标号上限of元素类型;其中,“下标号下限.下标号上限”

36、指的是类型变量的分量个数,其下标的类型是任何有序类型,一般的下标类型是整数类型;元素类型可以是任何类型。例2.8 定义一个一维数组。程序代码如下:type myarray=array1.10of integer; mychar=arraya.zof char;声明一维数组变量:vari:myarray;数组赋初值:procedure tform1.button1click(sender: tobject);type myarray=array1.10of integer;var i:myarray;begin i1:=55; i2:=5; label1.caption :=inttostr(i

37、2);end;其中,数组变量i得到55和5这两个值,其余的数组元素值系统默认为0,label1的标题显示5。一般采用循环语句给数组赋值,关于循环语句将在后面章节中讲解。 2)多维数组:它是指数组中的元素本身也是一维数组。其中二维数组属于多维数组,二维数组是一维数组的推广,它是最常用的多维数组。定义二维数组的格式如下:type 数组标识符=array下标号下限.下标号上限,下标号下限.下标号上限of元素类型其中,数组标识符和一维数组的标识符相同,只是增加了一个“下标号下限.下标号上限”定义二维数组。例如:type myarray=array1.5,1.5of integer;var i:myar

38、ray;定义了一个二维数组myarray,声明数组变量i。例2.9 二维数组的赋值和应用。程序代码如下:procedure tform1.button1click(sender: tobject);type myarray=array1.5,1.5of integer;var i:myarray;begin i1,1:=55;/给数组赋值 i2,2:=5;/给数组赋值 label1.caption :=inttostr(i1,1); /显示数组1,1中的值end;执行这段程序后,结果是55。除数组中1,1,2,2元素外,其他的元素值均为0,赋值方法和一维数组相同,一般采用循环语句给数组赋值。注

39、意:i1,1等价于i11。(3)记录类型:前面介绍的枚举类型、子界类型和数组类型都是相同数据类型的集合。然而,在实际应用中,常把一些不同数据类型的数据集中在一起,作为一个整体。因此,引入了记录类型,记录类型和数据库的记录相似。如一个通信录由下列字段组成:编号:(整型)姓名:(字符串型)年龄:(整型)地址:(字符串型)电话:(整型)这是数据库中的字段,同样记录类型也可以定义这组数据。定义记录类型在声明时,需要为每个字段定义名称和类型,定义记录类型的一般格式如下:type 记录类型标识符=record 字段标识符1:类型1; 字段标识符2:类型2; 字段标识符n:类型n;end;其中,record

40、,end是保留字,记录类型以end结束;记录类型标识符是记录类型名;字段标识符是字段名;类型是该字段的数据类型,可以是任意类型。例如,上述通信录可以定义成下列程序:type friend=record id:integer; name:string; age:integer; addr:string; tele:integer;end;其中,定义了friend类型的记录,该记录由5个字段组成,且每个字段都有其标识符和类型。声明记录类型变量和声明其他变量类似,声明记录类型变量的格式如下:var 记录变量:记录类型标识符;例如:var fri:friend;声明记录变量后就可以访问记录中的任何一个

41、字段,访问记录中某字段的语法格式如下:记录变量名.字段名例如:fri.id :=1;f:=张宏进;fri.age:=20;fri.addr:=陕西;fri.tele:=86525652;由程序可见,给记录字段赋值,每个字段前都有“fri”,这样重复的工作量增大。用with语句可以解决这个问题,with语句的语法格式如下:with记录变量名do begin end;with后的记录变量名允许有多个,且记录变量名之间要用逗号隔开;do后一般是复合句,使用begin和end括起来。with语句的功能是为了节约输入量,如果with语句后面只跟一条语句,这样增加了用户的输入量。例2.10

42、with语句的应用。程序代码如下:with fri do begin id :=1; name:= 张宏进; age:=20; addr:= 陕西; tele:=86525652; end;3指针类型指针类型是一种特殊的类型。前面讲述的类型变量都是静态的,程序运行时占用固有的内存空间,运行结束后才释放内存空间。指针类型不太复杂,但是在任何一种语言中都比较难理解,因为它的灵活性很高。指针类型是以“”开始,后跟类型名,定义指针类型的语法格式如下:type 指针类型=类型名; 其中,类型名是指针所指向的数据类型。例如:type pinteger=integer; pchar=char;其中,定义了两

43、个指针类型,一个是pinteger,指向integer类型的数据;另一个是pchar,指向char类型的数据。先定义指针,再声明指针变量。例如:var ip:pinteger; cp:pchar;定义指针和变量声明也可以同时进行。例如:var ip:integer; cp:char;指针类型可以是简单类型,也可以是构造类型。4可变类型可变类型又称为变体类型。主要用于支持ole自动化操作,还用于经常变动的类型,它是一种功能强大的类型,声明可变类型的变量如下:var myvar:variant;可变类型变量myvar声明后,默认初始化为一个特殊的值unassigned,表示myvar没有被赋值;当

44、变量myvar的值为特殊值null时,表明变量myvar的值未知或者是数据丢失。可变类型的变量可以是整型、实型、日期时间型、字符型和布尔型等,编译器自动进行类型转换。可变类型的主要用途是可以动态地改变其数据类型。例2.11 可变类型变量的声明和应用。程序代码如下:procedure tform1.button1click(sender: tobject); var v1,v2,v3,v4,v5:variant;begin v1:=123;/v1整型 v2:=asd; /v2字符串型 v3:=25.36;/v3实数型 v5:=v1+v2;/v5字符串型 v4:=v3+v1;/v4实数型 labe

45、l1.caption:=v5;/v5字符串型 label2.caption:=v4;/v4字符串型end;在按钮单击事件中,可变类型使用整型、字符串型、实数型,label1的标题显示“123asd”;label2的标题显示“148.36”。2.1.6 类型的转换类型的转换两个数据在赋值或者计算时类型必须相同,不相同将出现错误。这时就需要将不同类型的数据转换成同一种类型。数据类型的转换分为自动类型转换和强制类型转换。1自动类型转换自动类型转换是指系统自动将一种类型a转换成另一种类型b。自动转换的条件是类型a在类型b的取值范围内,从精度低的方向向精度高的方向转换。例2.12 自动类型转换的应用。程

46、序代码如下:procedure tform1.rclick(sender: tobject); var i:integer; f:real; c:char; s:string;begin i:=3; f:=i+2.22; /编译时不会出错 c:=j; s:=c;/编译时不会出错 label1.caption:=s; label2.caption:=floattostr(f);end;其中,f:=i+2.22;在编译时不会出错,如果i:=f;将出现错误。2强制类型转换强制类型转换是指从一种类型强制转换成另一种类型,并不是所有的类型都可以强制转换成另一种类型。例2.13 强制类型转换的应用。程序代

47、码如下:procedure tform1.rclick(sender: tobject); var i:integer; c:char;begin c:=a; i:=integer(c);/强制转换成整型 label1.caption:=inttostr(i);/inttostr是类型转换函数 i:=98; label2.caption:=char(i); /强制转换成字符型end;执行该段程序后,label1的标题是“97”;label2的标题是“b”。注意:强制类型转换有可能造成数据的丢失。2.1.7 标号、数值和字符串标号、数值和字符串在object pascal语言中标号、数值和字符串

48、是常用的,并对它们做了相应的规定。1标号在delphi语言中,保留了goto语句。goto语句的语法格式如下:goto标号;其中,标号是09 999之间的整数,并允许使用标识符作为标号。goto语句的功能是转到有“标号”的语句执行。使用goto语句前必须先声明标号,且在同一段程序中不允许跳出过程和函数。例2.14 goto语句定义的应用。程序代码如下:implementation var i:integer;$r *.nfmprocedure tform1.button1click(sender: tobject); label asd;begin asd: i:=1+i; label1.ca

49、ption:=inttostr(i); sleep(1000);/暂停1000毫秒 goto asd;end;该程序的功能是实现i的累加。在结构化程序中一般不使用goto语句。因为使用goto语句容易使程序混乱,可读性差。2数值在delphi语言中,一般使用的数值是十进制数,但也可写成十六进制数。(1)十进制数:一般的书写都是十进制数,如10,526,21.58等;也可用科学计数法表示,如54.25e+3表示54 250。(2)十六进制数:十六进制数值可以表示整数,以“$”开始,例如:$54b表示十进制整数1 355。3字符串字符串是用单撇号括起来的一串字符。单撇号内可以是特殊字符,如:!,#

50、和¥等;也可以是字符串的表示形式,如我喜欢delphi、你好。如果要表示单撇号时,需要使用两个单撇号表示为一个单撇号,例如:“”表示“”。在delphi语言中允许在字符串中嵌入控制符,控制符是由特殊符号“#”和紧跟其后的0255之间的无符号整数构成,表示ascii码中的字符。例如:#97/表示字符a#97#98#99/表示abc注意:书写“#97”时,不要用单撇号括起来,如#97,输出的是#97,而不是字母“a”。直接书写#97即可输出字母“a”。2.1.8 运算符运算符运算是对数据进行加工的过程,而运算符是各种运算的符号,例如,加、减、乘、除运算符。在object pascal语言中,运算符

51、主要包括赋值运算符、算术运算符、逻辑运算符、位运算符、字符串运算符、关系运算符和布尔运算符等。1赋值运算符赋值运算符比较简单,在前面大多数程序中都用到了赋值运算符,在此不再赘述。赋值运算符是用“:=”来表示的。例2.15 赋值运算符的应用。程序代码如下:var i,d:integer; i:=25; d:=i;其中,i赋值为25,i又赋值给d,所以d的值是25。2算术运算符(1)算术运算符:它可分为单目运算符和双目运算符。单目运算符如表2.10所示;双目运算符如表2.11所示。表2.11 双目运算符表2.10 单目运算符说明:1)取正、取负与加减乘除的运算和数学中的运算相同,操作数可以是整型或

52、实型。 2)除的结果是实型。 例2.16 除法的应用。程序代码如下:procedure tform1.button1click(sender: tobject);vari:integer;f:real;begini:=5;f:=i/4;/“i/4”值是实型label1.caption:=floattostr(f);end; 3)参加整数除法和求余运算的操作数必须是整型,其结果也是整型。例2.17 div和mod的应用。程序代码如下:5 div 2;/整除取商,结果为2-5 div -2; /整除取商,结果为25 div -2; /整除取商,结果为2-5 div 2; /整除取商,结果为25 m

53、od 2; /整除取余,结果为15 mod -2;/整除取余,结果为1-5 mod 2;/整除取余,结果为1-5 mod -2;/整除取余,结果为1 4)在除、整数除、整数求余运算的表达式中除数不能为0。(2)算术表达式:它是由常量、变量、函数、运算符和括号组成的,运算结果是一个数值。如2+59*8+6/5,其结果自动转换成实数型,结果为63.8。算术表达式和数学中的表达式十分相似,但也有一些区别。 1)数学中x平方的表达式为x2,而在算术表达式中为x*x。 2)在数学表达式中,小括号外面还可以有中括号或大括号,但在算术表达式中不允许,只能使用多重小括号。如数学表达式中65+23(23+36)

54、+66表示成算术表达式为65+23*(23+36)+66)。 3)算术表达式不能简写,如8x需要表示成8*x。(3)算术运算符的优先级。算术表达式运算符包括加、减、乘、除、取正、取负、mod和div,它们的优先级顺序从高到低如下:取正/取负乘/除mod/div加/减在算术表达式中,同一级别运算符的结合性是自左向右;如果表达式中包括括号,先运算括号中的表达式;如果是多重括号,最里面括号中表达式的优先级最高。3逻辑运算符逻辑运算又称为布尔运算,其运算结果是布尔型。逻辑运算符可以连接若干表达式,如不等式0 x99表示成0 x and x99。逻辑运算符如表2.12所示。表2.12 逻辑运算符其中,除

55、not是单目运算符外,其余的均为双目运算符。设a,b为逻辑值,其运算结果如表2.13所示。表2.13 a,b逻辑运算在逻辑运算中,如果两个表达式均为真,两个表达式进行and逻辑运算,其结果为真,否则为假;如果两个表达式均为假,两个表达式进行or逻辑运算,其结果为假,否则为真;如果两个表达式的布尔值不同,两个表达式进行xor逻辑运算,其结果为真,否则为假;not运算是由真变假,由假变真。4位运算符位运算是二进制运算,即把整数先换算成二进制的形式,然后再运算,结果是整型,并按二进制形式进行位的移动和比较。位运算符如表2.14所示。表2.14 位运算符其中,除not是单目运算符外,其余的位运算符都是

56、双目运算符。下面讲述各个位运算符的运算过程。(1)not位运算符,是按位非,即把操作数的每一位都取反,0变成1,1变成0。例如:i:=not 6;i的值是7(6的二进制形式是00000110,而7的二进制形式是11111001)。(2)and位运算符,是按位与。当两个数都为1时,结果才为1。例如:v1:=2;/00000010v2:=3;/00000011i:=v1 and v2;/00000010所以i的值是2。(3)or位运算符,是按位或,两位中有一位是1时,其结果为1。例如:v1:=2;/00000010v2:=3;/00000011i:=v1 or v2; /00000011所以i的值

57、是3。(4)xor位运算符,两位相异或时,其结果为1。例如:v1:=5;/00000101v2:=3;/00000011i:=v1 xor v2; /00000110所以i的值是6。(5)shl位运算符,左移,即每个二进制的数值向左移。例如:i:=7 shl 2;/00000111左移2位i的结果是28,即00011100。(6)shr位运算符,右移,即每个二进制的数值向右移。例如:i:=7 shr 2;/00000111右移2位i的结果是1即00000001。5字符串运算符在object pascal语言中,字符串运算符只有一种,即连接运算符“+”,该运算符可以使两个或两个以上的字符串连接起

58、来。连接运算符可以连接字符常量、字符串常量、字符变量和字符串变量等。字符串表达式的语法格式如下:字符串表达式+字符串|字符例如:str:= 我喜欢+delphi;/str的值是“我喜欢delphi”str:= 123+delphi+456;/str的值是“123delphi456”str:= a+ + bcdef ; /str的值是“a bcdef”6关系运算符关系运算符又称为比较运算符,是用来比较两个表达式的值,其结果是布尔型。在object pascal语言中关系运算符有7种,如表2.15所示。注意:(1)关系运算符的优先级别相同。(2)关系运算符两侧的表达式的类型可以是任意的,但是类型必

59、须一致。在比较两个字符串时,如果第一个字符大,其字符串也大,如果第一个字符相同再比较第二个,依此类推。常见字符值的大小如下:表2.15 关系运算符空格09azaz任何汉字7运算符的优先级前面讲述了object pascal的基本运算符,在object pascal语言中可以使用任意的运算符来连接任意表达式。例如:f:=6+3*6/89*(5 mod 3);如果不知道其优先级,就无法计算整个算术表达式。下面讲述它们的优先级别,优先级由高到低的顺序如下:(1)()(2)函数(3)not(4)*,/,div,mod,and,shl,shr(5)+,or,xor(6)=,=,in例如:f:=6+3*6

60、/89*(5 mod 3);/f值是640 449 438 202 247(6-3)5) /结果是true(6-3)5)/语法错误8 in 2,8 /结果是true88+99 /结果是88992.1.9 注释注释程序的注释是对一段程序或者一行程序的解释。在编译过程中不参与编译,用来增强程序的可读性。程序中常使用“/”注释程序。注释有两种方式,即整行注释和行内注释。1整行注释整行注释是以“/”开始,“/”后的所有内容都属于注释的内容。一般情况下都采用整行注释,用来注释此行的内容。2行内注释行内注释常使用“”或“(*)”。只要在“”或者“(*)”中的部分都属于注释。“/”与“”和“(*)”的区别是“/”只

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论