子界类型(Subrange types)

子界类型(Subrange types)定义了某种有序类型的一个子集,子界的有序值必须是在别的有序类型中已经定义过的。子界中有序值的索引被基类确定。

它的形式为Low..High。这里LowHigh是同一个有序类型的常量表达式,并且LowHigh要小。

定义一个子界类型变量,那么赋给该变量的值必须是子界定义范围内的值。

还是举个详细的例子来说明吧。

1、新建一个Console Application

2、然后输入以下的代码,请仔细关注注释说明。

program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils;
const
  X = 50;
  Y = 10;
type
  Scale = 2 * (X - Y)..(X + Y) * 2; { 常量表达式}
  //Scale = (X - Y) * 2..(X + Y) * 2;
  { 此句声明和上面的low..high范围是一样,但是注释掉的这句会导致编译错误。
  在任何类型声明中,等号(=)后面如果是左圆括号((),编译器则会认为是枚举类型,
  依次上面声明不是枚举的话就会出错,避免声明不是枚举类型时,左圆括号出现在等号后面}
  TColors = (Red, Blue, Green, Yellow, Orange, Purple, White, Black); { 枚举}
  TMyColors = Green..White; { 定义一个子界类型,范围为枚举中的Green到White}
  {TMyColors包括了Green, Yellow, Orange, Purple, White}
  TSomeNumbers = -128..127; { 数字范围的子界类型}
  TCaps = 'A'..'Z';         { 字符范围的子界类型}
var
  SomeNum: 1..500;         { 也可直接定义子界类型变量}
  MyColors: TMyColors;
  SomeNumbers: TSomeNumbers;
  Caps: TCaps;
  Letter: Char;
begin
  //Caps := 'e';
  { 此句将导致编译错误“Constant expression violates subrange bounds”超出范围}

  Letter := 'e';
  Caps := Letter;
  { 以上两句可以通过编译,但是运行下面的注释掉的代码也会出现错误,超出子界的范围}
  //Writeln('Caps在TCaps中的索引为:' + IntToStr(Ord(Caps)));

  MyColors := Green;
  Writeln('Green在TMyColor中的索引为:' + IntToStr(Ord(MyColors)));
  Readln;
end.

3、F9运行后,我们来验证结果,结果如下:

0048

以上代码均在Delphi7中测试通过,示例代码下载:20111224子界类型(Subrange_types).rar

posted on 2011-12-24 20:52  pchmonster  阅读(3451)  评论(0编辑  收藏  举报

导航