我学Delphi心得及笔记----类型、变量及常量(第二讲)

1、变量

Pascal 变量在使用前必须声明,声明变量时必须指定一种数据类型。下面是变量声明的例子:

var
  Value: Integer;
  IsCorrect: Boolean;
  A, B: Char;
申明变量以var为关键字,格式为:var 变量名:类型;
2、常量
对于在程序运行期间保持不变的值,Pascal 允许通过常量来声明。声明常量不必特定数据类型,但需要赋一个初值。编译器会根据所赋初值自动选用合适的数据类型。例如:
const
  Thousand = 1000;
  Pi = 3.14;
  AuthorName = 'Marco Cantù';常量及为在编辑与运行期间不可对其值进行改变;
Delphi 根据常量的值来决定它的数据类型。上例中的Thousand 变量,Delphi会选用SmallInt数据类型 (短整型--能容纳Thousand变量的最小整数类型)。如果你想告诉Delphi 采用特定的类型,你可在声明中加入类型名,方法如下:
const
  Thousand: Integer = 1000;
对于声名的常量,编译器有两种编译选择:第一种为常量分配内存,并把常量的值放入内存;第二种在常量每次使用时复制常量值。第二种方法比较适合简单常量。
3、资源串常量
当定义字符串常量时,你可这样写:
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 来完成有效的内存处理,另一方面不用更改源代码就可实现程序的本地化 (把字符串翻译成不同的语言)。

4、数据类型

Pascal 中有多种预定义的数据类型,它们可分为三大类:有序数据类型,实数类型和字符串类型。下面我们先讨论有序类型和实数类型,字符串类型放在以后讨论。同时这一节还将介绍几种Delphi 库中定义的类型 (不是编译器预定义的类型),这些类型也可看作是预定义的类型。

Delphi 还包括一种无类型的可变数据类型,称作variant,在本书的第十讲将讨论这一类型。variant是一种无需类型检测的数据类型,它在Delphi 2 中引入,用于处理OLE Automation(OLE 自动化)。

5、有序类型

有序类型是建立在概念“顺序”或“序列”基础上的数据类型。你不仅可比较两个有序值的大小,而且可以求取给定有序值的前驱及后继,或者计算它们的最大或最小值。

三种最重要的预定义有序类型是整数类型、布尔类型和字符类型(Integer,Boolean,Char)。各种类型根据其内部表示和取值范围不同又可进一步细分。表3.1列出了表示数字的有序数据类型。

表 3.1: 表示数字的有序数据类型

大小有符号值域无符号值域
8 bitsShortInt
-128 to 127
Byte
0 to 255
16 bitsSmallInt
-32768 to 32767
Word
0 to 65,535
32 bitsLongInt
-2,147,483,648 to 2,147,483,647
LongWord (从 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)都支持这一新类型。反过来,有两个新增的专用函数StrToInt64StrToInt64Def支持从字符串向数字的转换。

布尔类型

布尔值不同于布尔类型,平时很少用到。ByteBool、 WordBool 和LongBool这三种布尔类型的布尔值比较特殊,只在Windows API 函数中才用到它们。

在Delphi 3 中,为了与Visual Basic 和 OLE Automation兼容,修改了ByteBoolWordBool LongBool的布尔值,将TRUE值设置为1,FALSE值仍为0;Boolean类型布尔值保持不变(TRUE为1,FALSE为0)。如果在Delphi 2代码中使用了布尔值显式类型转换 ,那么在以后的Delphi中可能会出错。

字符类型

字符有两种不同的表示法:: ANSICharWideChar。第一种类型代表 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? 这是很难说清的。

日期和时间

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类型值

到目前为止,我们所看到的预定义数据类型都是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)的转换例程,也没包括用于格式化处理的特殊例程,如FormatFormatFloat 例程。

表3.4:类型转换系统例程

例程作用
Chr将一个有序数据转换为一个ANSI字符
Ord将一个有序类型值转换为它的序号
Round转换一个实型值为四舍五入后的整型值
Trunc转换一个实型值为小数截断后的整型值
Int返回浮点数的整数部分
IntToStr将数值转换为字符串
IntToHex将数值转换为十六进制数字符串
StrToInt将字符串转换为一个整型数,如字符串不是一个合法的整型将引发异常
StrToIntDef将字符串转换为一个整数,如字符串不合法返回一个缺省值
Val将字符串转换为一个数字(传统Turbo Pascal例程用于向后兼容)
Str将数字转换为格式化字符串(传统Turbo Pascal例程用于向后兼容)
StrPas将零终止字符串转换为Pascal类型字符串,在32位Delphi中这种类型转换是自动进行的
StrPCopy拷贝一个Pascal类型字符串到一个零终止字符串, 在32位Delphi中这种类型转换是自动进行的
StrPLCopy拷贝Pascal类型字符串的一部分到一个零终止字符串
FloatToDecimal将一个浮点数转换为包含指数、数字及符号的十进制浮点记录类型
FloatToStr将浮点值转换为缺省格式的字符串
FloatToStrF将浮点值转换为特定格式的字符串
FloatToText使用特定格式,将一个浮点值拷贝到一个字符串缓冲区
FloatToTextFmt同上面例程,使用特定格式,将一个浮点值拷贝到一个字符串缓冲区
StrToFloat将一个Pascal字符串转换为浮点数
TextToFloat将一个零终止字符串转换为浮点数

注意:在最近版本的Delphi Pascal 编译器中,Round 函数是以 CPU 的 FPU (浮点部件) 处理器为基础的。这种处理器采用了所谓的 "银行家舍入法",即对中间值 (如 5.5、6.5) 实施Round函数时,处理器根据小数点前数字的奇、偶性来确定舍入与否,如 5.5 Round 结果为 6,而 6.5 Round 结果也为6, 因为 6 是偶数。特定的Windows 类型

转载于:https://www.cnblogs.com/youshan/archive/2011/07/09/2101780.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值