




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PASCAL精要 类型、变量及常量PASCAL精要-类型、变量及常量2010-04-20 15:31最初的Pascal语言是以一些简单的概念为基础建立起来的,这些概念现在普遍出现在编程语言中。最重要的概念当属数据类型,数据类型决定了变量可取的值,以及可在这些值上进行的操作。Pascal数据类型的概念强于C语言及早期的BASIC语言,在C语言中算术数据类型是可以互换的,而早期的BASIC语言中根本没有与数据类型相似的概念。变量Pascal变量在使用前必须声明,声明变量时必须指定一种数据类型。下面是变量声明的例子:var Value:Integer;IsCorrect:Boolean;A,B:Char;关键字var可以在许多地方使用,例如放在函数或过程的开始部分,用来声明函数或过程的局部变量;也可以放在单元中,用于声明全程变量。var关键字之后是一组变量名列表,每个变量名后跟一个冒号和数据类型名,一行中可以声明多个变量,如上例中最后一句。一旦变量的类型被指定,你只能对变量执行该变量类型支持的操作。例如,在判断操作中用布尔值,在数字表达式中用整型值,你不能将布尔值和整型值混用(在C语言中可以这样)。使用简单的赋值语句,可写出下面的代码:Value:=10;IsCorrect:=True;但下面的语句是不正确的,因为两个变量数据类型不同:Value:=IsCorrect;/error在Delphi中编译这句代码,会出现错误信息:Incompatible types:IntegerandBoolean.(类型不兼容:整型和布尔型)。象这样的错误通常是编程错误,因为把一个True或False的值赋给一个整型变量没有什么意义。你不该责怪Delphi提示这样的错误信息,代码中有不对的地方Delphi当然要提出警告。把变量的值从一种类型转换到另一种类型往往不难做到,有些情况下类型转换会自动实现,不过一般情况下需要调用特殊的系统函数,通过改变数据内部表示来实现类型转换。在Delphi中,当你声明全程变量时,你可以赋给它一个初值。例如,你可以这样写:var Value:Integer=10;Correct:Boolean=True;这种初始化方法只能用于全程变量,不能用于过程或方法的变量。常量对于在程序运行期间保持不变的值,Pascal允许通过常量来声明。声明常量不必特定数据类型,但需要赋一个初值。编译器会根据所赋初值自动选用合适的数据类型。例如:const Thousand=1000;Pi=3.14;AuthorName=Marco Cant;Delphi根据常量的值来决定它的数据类型。上例中的Thousand变量,Delphi会选用SmallInt数据类型(短整型-能容纳Thousand变量的最小整数类型)。如果你想告诉Delphi采用特定的类型,你可在声明中加入类型名,方法如下:const Thousand:Integer=1000;对于声名的常量,编译器有两种编译选择:第一种为常量分配内存,并把常量的值放入内存;第二种在常量每次使用时复制常量值。第二种方法比较适合简单常量。:16位的Delphi允许你在程序运行期间改变已定义的常量值,就象一个变量一样。32位的Delphi为了向后兼容仍容许这种操作,只要你附加$J编译指令,或选择工程选项对话框中Compiler(编译器)页的Assignable typed constants复选框就行。尽管如此,这里我还是要强烈建议万不得以不要使用上述操作,因为把新值赋给常量将使编译器不能对常量进行优化,与其如此不如直接声明一个变量。资源串常量当定义字符串常量时,你可这样写:const AuthorName=Marco Cant;从Delphi 3开始,你可以用另一种方式写:resourcestring AuthorName=Marco Cant;上面两个语句都定义了一个常量,也就是定义了一个在程序运行期间保持不变的值,但两者的实现过程却不同,用resourcestring指令定义的字符串变量将被保存到程序资源的字符串表中。从例子ResStr你可了解资源串的实际作用,例子中设置了一个按钮,相应代码如下:resourcestring AuthorName=Marco Cant;BookName=Essential Pascal;procedure TForm1.Button1Click(Sender:TObject);begin ShowMessage(BookName+#13+AuthorName);end;以上代码中的两个字符串将分两行输出显示,因为字符串被分行符#13隔开。有趣的是,当你用资源编辑器打开执行文件时,你会在程序资源中看到你所定义的字符串。这意味着字符串并没有进入编译代码,而是保存在执行文件(EXE文件)的一个单独区域。:简而言之,采用资源的好处一方面可让Windows来完成有效的内存处理,另一方面不用更改源代码就可实现程序的本地化(把字符串翻译成不同的语言)。数据类型Pascal中有多种预定义的数据类型,它们可分为三大类:有序数据类型,实数类型和字符串类型。下面我们先讨论有序类型和实数类型,字符串类型放在以后讨论。同时这一节还将介绍几种Delphi库中定义的类型(不是编译器预定义的类型),这些类型也可看作是预定义的类型。Delphi还包括一种无类型的可变数据类型,称作variant,在本书的第十章将讨论这一类型。variant是一种无需类型检测的数据类型,它在Delphi 2中引入,用于处理OLE Automation(OLE自动化)。有序类型有序类型是建立在概念顺序或序列基础上的数据类型。你不仅可比较两个有序值的大小,而且可以求取给定有序值的前驱及后继,或者计算它们的最大或最小值。三种最重要的预定义有序类型是整数类型、布尔类型和字符类型(Integer,Boolean,Char)。各种类型根据其内部表示和取值范围不同又可进一步细分。表3.1列出了表示数字的有序数据类型。表3.1:表示数字的有序数据类型大小有符号值域无符号值域8 bitsShortInt-128 to 127Byte 0to 255 16 bitsSmallInt-32768 to 32767Word 0to 65,535 32 bitsLongInt-2,147,483,648 to 2,147,483,647LongWord(从Delphi 4)0 to 4,294,967,295 64 bitsInt64 16/32 bitsIntegerCardinal从表中可看到,不同数据类型与不同的数据表示法相对应,这要取决于数据值的数位和符号位。有符号类型的数值可正可负,但取值范围较小,因为符号位占一个数位。下一节在例Range中说明了每种类型的实际取值范围。表中最后一组类型标志着16/32,它表明其数值表示方法在16位和32位Delphi中不同,该组的Integer及Cardinal类型比较常用,因为它们与CPU内部的数字表示法相对应。Delphi 4中的整数类型在Delphi 3中,Cardinal类型所表示的32位无符号值实际占31位,取值最高为20亿。Delphi 4新增了一种无符号数字类型-LongWord,它是真正的32位值,取值最高达40亿。现在Cardinal类型已成了LongWord类型的别名,只是LongWord能容纳大于20亿的无符号数,而且它的数值表示法与CPU内部数值表示法一致。Delphi 4中新增的另一个数据类型是Int64类型,这一类型能表示长达18个数字的整数。系统中的有序类型例程(如High和Low)、数字例程(如Inc和Dec)及字符串转换例程(如IntToStr)都支持这一新类型。反过来,有两个新增的专用函数StrToInt64和StrToInt64Def支持从字符串向数字的转换。布尔类型布尔值不同于布尔类型,平时很少用到。ByteBool、WordBool和LongBool这三种布尔类型的布尔值比较特殊,只在Windows API函数中才用到它们。在Delphi 3中,为了与Visual Basic和OLE Automation兼容,修改了ByteBool、WordBool和LongBool的布尔值,将TRUE值设置为1,FALSE值仍为0;Boolean类型布尔值保持不变(TRUE为1,FALSE为0)。如果在Delphi 2代码中使用了布尔值显式类型转换,那么在以后的Delphi中可能会出错。字符类型字符有两种不同的表示法:ANSIChar和WideChar。第一种类型代表8位的字符,与Windows一直沿用的ANSI(美国国家标准协会)字符集相应;第二种类型代表16位的字符,与Windows NT、Windows 95和98支持的双字节字符(Unicode)相应。在Delphi 3中,Char类型字符与ANSIChar一致。切记,不管在什么环境,前256个Unicode字符与ANSI字符是完全一致的。常量字符可用代表它们的符号表示,如k,也可用数字符号表示,如#78。后者还可用Chr函数表示为Chr(78),用Ord函数可作相反的转换Ord(k)。一般来说,对字母、数字或符号,用代表它们的符号来表示较好;而涉及到特殊字符时用数字符号较好。下面列出了常用的特殊字符:#9跳格(Tab键)#10换行#13回车(Enter键)有序类型系统例程Pascal语言和Delphi System单元中定义了一系列有序类型操作例程,见表3.2。C+程序员会注意到其中的Inc例程,它可与+和+=运算符对应(Dec例程也同样)。表3.2:有序类型系统例程例程作用Dec将例程中的参数值递减1或一个特定的值,其中特定值可在第二个可选参数中定义Inc将例程中的参数值增加1或一个特定的值Odd如果参数为奇数返回真Pred根据参数在其数据类型定义中的序列,返回参数值的前驱值Succ返回参数值的后继值Ord返回参数值在其数据类型值集合中的序号Low返回参数对应的有序数据类型的最小取值High返回参数对应的有序数据类型的最大取值注意,当有些例程用于常量时,编译器会自动用计算值替代例程。例如你调用High(X),设定X为一个整数,那么编译器会用整数类型中最大的可能值代替这个表达式。实数类型实数类型代表不同格式的浮点数。Single类型占的字节数最小,为4个字节;其次是Double浮点类型,占8个字节;Extended浮点类型,占10个字节。这些不同精度的浮点数据类型都与IEEE(电气和电子工程师协会)标准的浮点数表示法一致,并且CPU数字协处理器直接支持这些类型,处理速度也最快。Real类型在Delphi 2和Delphi 3中的定义与16位版本一样,都占6个字节。不过Borland公司一直不提倡使用这种类型,而建议用Single、Double、Extended类型代替。这是由于Real这种6字节的旧格式既不受Intel CPU的支持,又没有列在官方的IEEE实型中。为了完全解决这一问题,Delphi 4不得不修改Real类型的定义,将其改成标准的8字节浮点型,由此引起了兼容性问题,不过如果有必要,你可以采用下面编译指令克服兼容性问题,恢复Delphi 2和Delphi 3的Real类型定义:$REALCOMPATIBILITY ON另外还有两种奇怪的数据类型:Comp类型和Currency类型,Comp类型用8个字节描述非常大的整数(这种类型可支持带有18位小数的数字);Currency类型(16位版的Delphi不支持该类型)表示一个有四位小数位的值,它的小数位长度是固定的,同Comp类型一样也占8个字节。正如名字所示,Currency数据类型是为了操作很精确的四位小数货币数值才添加的。对实型数据,我们没办法编一个类似Range的程序,因为High、Low及Ord函数不能用于实型值。理论上说实型类型代表一个无限的数字集合;有序类型代表一个有限的数字集合。:让我进一步把上述问题解释一下。对于整数23,你能确定23后面的数是什么,因为整型数是有限的,它们有确定的值域范围及排列顺序。而浮点数即使在一个很小的值域范围内也无限、无序。事实上,在23和24之间有多少值?哪个值是23.46后面的值?23.47还是23.461,或者23.4601?这是很难说清的。因此,如问Char类型字符w的顺序位置是有意义的,但同样的问题对浮点类型数7134.1562就毫无意义。对于一个实型数,你能确切知道有没有比它大的实型数,但是,如想探究给定的实数前到底有多少个实型数(这是Ord函数的作用),是得不到结果的。实型类型在用户界面编程中用得不多,但是Delphi从各方面支持实型类型,包括在数据库方面的支持。由于支持IEEE浮点数运算标准,Object Pascal语言完全适合于各类数值计算编程。如果对这部分感兴趣,你可以参考Delphi在System单元中提供的算术函数(详细见Delphi帮助)。:Delphi带有一个Math单元,其中定义了一些高级数学例程,这些例程包括三角函数(如ArcCosh函数)、金融函数(如InterestPayment函数)和统计函数(如MeanAndStdDev过程)。有些例程,它的名字听起来很怪,如MomentSkewKurtosis例程,它是作什么用的呢?还是留你自己查吧。日期和时间Delphi也用实型数表示日期和时间数据。但为了更准确起见,Delphi特别定义了TDateTime数据类型,这是一个浮点类型,因为这个类型必须足够宽,使变量能容纳年、月、日、时、分和秒、甚至毫秒。日期值按天计数,从1899-12-30开始,放在TDateTime类型的整数部分;时间值则位于十进制数的小数部分。TDateTime不是编译器可直接识别的预定义类型,它在System单元定义:type TDateTime=type Double;使用TDateTime类型很简单,因为Delphi为该类型定义了一系列操作函数,表3.3列出了这些函数。表3.3:TDateTime类型系统例程例程作用Now返回当前日期及时间Date返回当前日期Time返回当前时间DateTimeToStr按缺省格式将日期和时间值转换为字符串;特定格式转换可用FormatDateTime函数DateTimeToString按缺省格式将日期和时间值拷贝到字符串缓冲区DateToStr将TDateTime值的日期部分转为字符串TimeToStr将TDateTime值的时间部分转为字符串FormatDateTime按特定格式将日期和时间值转换为字符串StrToDateTime将带有日期和时间信息的字符串转换为TdateTime类型值,如串有误将引发一个异常StrToDate将带有日期信息的字符串转换为TDateTime类型格式StrToTime将带有时间信息的字符串转换为TDateTime类型格式DayOfWeek根据传递的日期参数计算该日期是一星期中的第几天DecodeDate根据日期值返回年、月、日值DecodeTime根据时间值返回时、分、秒、毫秒值EncodeDate组合年、月、日值为TDateTime类型值EncodeTime组合时、分、秒、毫秒值为TDateTime类型值特定的Windows类型到目前为止,我们所看到的预定义数据类型都是Pascal语言自身定义的类型。Delphi中还包含Windows系统定义的数据类型,这些数据类型不是Pascal语言的组成部分,而是Windows库的一部分。Windows类型包括新增的缺省类型(例如DWORD或UINT)、各种记录(或结构)类型及指针类型等。Windows定义的数据类型中,最重要的类型是句柄(handle),第九章中将讨论这一类型。类型映射及类型转换正如所知,你不能把一个变量赋给另一个不同类型的变量,如果你需要这么做,有两种方法供选择。第一种方法是采用类型映射(Typecasting),它使用一个带有目标数据类型名的函数符号:var N:Integer;C:Char;B:Boolean;begin N:=Integer(X);C:=Char(N);B:=Boolean(0);你可以在字节长度相同的数据类型之间进行类型映射。在有序类型之间或实型数据之间进行类型映射通常是安全的,指针类型及对象之间也可以进行类型映射,只要你明白自己在做什么。然而,一般来说类型映射是一种较危险的编程技术,因为它允许你访问一个似是而非的值,该值好象是其它值的替身。由于数据类型的内部表示法之间通常互相不匹配,所以当遇到错误时会难以追踪,为此你应尽量避免使用类型映射。第二种方法是使用类型转换例程。表3.4中总结了各种类型转换例程。其中有些例程所涉及的数据类型将在下一节中讨论。注意表中没有包括特殊类型(如TDateTime和variant)的转换例程,也没包括用于格式化处理的特殊例程,如Format和FormatFloat例程。表3.4:类型转换系统例程例程作用Chr将一个有序数据转换为一个ANSI字符Ord将一个有序类型值转换为它的序号Round转换一个实型值为四舍五入后的整型值Trunc转换一个实型值为小数截断后的整型值I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 船舶用纺织品考核试卷
- 呼伦贝尔民族风情园旅游策划及概念性规划
- 狂犬病预防知识课件
- 耕地保护知识考试试题及答案
- 初级车工考试试题及答案
- 阜阳叉车考试试题及答案
- 电工证书考试试题及答案
- 干部宪法考试试题及答案
- 父亲班会课件
- 二级司炉考试试题及答案
- DL∕T 1099-2009 防振锤技术条件和试验方法
- 2024年春七年级历史下册 第一单元 隋唐时期 繁荣与开放的时代 第1课 隋朝的统一与灭亡教案 新人教版
- CJ/T 156-2001 沟槽式管接头
- 黑龙江省齐齐哈尔市五县联考2023-2024学年七年级下学期期末数学试题
- CJJT81-2013 城镇供热直埋热水管道技术规程
- 留置导尿法操作评分标准
- 图集04S206自动喷水与水喷雾灭火设施安装
- IQC来料不合格品处理流程管理规定
- 2023年拍卖师考试真题模拟汇编(共469题)
- MOOC 引领世界的中国乒乓-西南交通大学 中国大学慕课答案
- 低碳示范区评价技术规范低碳景区
评论
0/150
提交评论