FALSE)=0 ORD(TRUE)=0 PRED(TRUE)=FALSE
ByteBool、WordBool、 LongBool False<>True
Ord(False)=0 Ord(True)<>0 Pred(False)=true
Succ(False)=True
Succ(False)=True
简单数据类型->有序数据类型->枚举类型
?
?
表示一组带值符号的有序数据类型 枚举类型是一种高级数据类型,在使用其变量之前,必须 通过类型声明语句进行具体的声明
格式为:type
类型名称=(符号1,符号2,…符号n); 类型名称必须是合法的标识符;圆括号中所列出的符号即为 该枚举类型的取值,这些取值被称为枚举常量,必须是合 法的标识符,而不能是任何数据类型或者任何类型的数据; 枚举常量不能在同一枚举类型中重复出现,也不能在不同的 枚举类型中重复出现。
例程
program Project1; {$APPTYPE CONSOLE} uses SysUtils; type MyWeek=(mwMon,mwTue,mwWed,mwThu,mwFri,mwSat,mwSun); var WeekDay:MyWeek; begin WeekDay:=mwFri; Inc(WeekDay,2); Writeln(Ord(WeekDay)); Readln; end.
枚举常量的序号
?
默认情况下,枚举常量的序号按照其在声 明中的顺序从0开始递增,也可以通过为其 中部分或全部枚举值显式赋予序号的方式 来改变这一规则。
若一个值没有明确指定序数,它的取值将 是前一个值的序数值加上1;如果第1 个值 没有指定序数,它的序数为0。
?
例程
program Project1; {$APPTYPE CONSOLE} uses SysUtils; type MyWeek=(mwMon=5,mwWed=10,mwFri=mwMon+mwWed); var WeekDay:MyWeek; begin WeekDay:=mwFri; Writeln(ord(WeekDay)); WeekDay:=MyWeek(6); Writeln(ord(WeekDay)); WeekDay:=Succ(WeekDay); Writeln(ord(WeekDay)); Readln; end.
实际上,枚举类型是这样一个子界类型,它 的最小
值和最大值,分别对应于声明时的 最小序数和最大序数。在上面的例子中Size 类型的最小序数为5,最大为15,所以它有 11 个可能的值。虽然只有其中的3 个值有名 称,但其它值通过类型转换、或通过一些 例程(比如Pred、Succ、Inc 和Dec)是可以 访问的。
?
枚举类型的变量代表枚举值序号的存储。 与编译开关有关。
例程
program Project1; {$APPTYPE CONSOLE} uses SysUtils; type MyWeek=(mwMon,mwWed,mwFri=0); var WeekDay:MyWeek; begin writeln(ord(high(WeekDay))); writeln(ord(low(WeekDay))); writeln(ord(sizeof(WeekDay))); End.
简单数据类型->有序数据类型->子界类型
?
在实际应用中,许多变量的取值都会有一 定范围的限制。子界类型就是用来表示这 种具有确定的数据类型和确定的取值范围 的数据的数据类型。
子界类型的声明
?
子界类型是一种高级数据类型,在使用其变量之 前,也必须通过类型声明语句进行具体的声明。 声明子界类型的语法格式为 type 类型名称=下界…上界; 类型名称必须为合法的标识符,下界和上界必须 是相同的有序数据类型常量表达式,且上界必须 不小于下届。 子界中下界和上界所属的有序类型称为子界的基 类型。
子界类型值的序号与其在基类型中的序号 相同。子界类型可以执行的操作与其基类 型可以执行的操作相同。对子界类型,每 个值的序数取自基础类型,而且,它的值 不会回转到开头或结尾,即使它的基础类 型是整型或字符类型;当因增大或减小而 产生越界时,它的值只是简单地转换成基 础类型的值。
例程
program Project1; {$APPTYPE CONSOLE} uses SysUtils; const x=50; y=10; type myEnum=(Red,Green,Blue,Yellow,Black,White); MySub1=blue..black; MySub2=2*(x-y)..(x+y)*2; MySub3='a'..'c'; MySub4=True..True; var S1:MySub1; S2:MySub2; S3:MySub3; S4:MySub4;
?
begin S1:=Black; WriteLn(Ord(S1)); WriteLn(Ord(Low(S1))); WriteLn(Ord(High(S1))); S2:=90; WriteLn(Ord(S2)); WriteLn(Ord(Low(S2))); WriteLn(Ord(High(S2))); S3:='b'; WriteLn(Ord