该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
2.3 创建数据类型和子类型(Creating Types and Subtypes)
使用变量时,除了以某标识符作为变量的名称外,还要指定该变量的数据类型。一个数据类型定义了变量可接受的值以及所能执行的操作。比如说,一个数据类型为 Age 的变量 Bill,Age 的取值范围为 1..100,并只有 + - 这两种操作,在这里,对象(object)为名为 Bill 的变量,它的取值在 1..100 之间(包括 1,100),值的变化只能通过+ -这些基本运算符(primitive operation)来实现,而无法通过* /等其它运算符。Ada 中的数据类型,包括预定义类型,都是按照一定的格式在程序包中创建的。下面就介绍创建数据类型的一些基本内容,更多相关内容会在以后见到。
2.3.1 创建新的数据类型
创建一个新类型,需要使用保留字 type,is,range。格式如下:
type type_name is range range_specifcation;
type_name 为新类型的名称,是一个合法标识符;range_specifcation 表示该类型的取值范围,表示方式为 First .. Last,如 1..100 , -9 ..10 。
例如创建上面提及的一个新类型 Age :
type Age is range 1 .. 100;
这样就有了一个数据类型 Age, 取值范围 1 .. 100。
有一点要注意:range_specfication 中 First 要大于 Last。 如 type months is range 12 .. 0, 实际上 months 是一个空集(null),而不是所期望的 0..12。
不同数据类型之间是不能进行混合运算的,即使取值范围和运算符一样,看以下的程序例子:
000 -- filename: putwage.adb
001 with Ada.Text_IO; use Ada.Text_IO;
002 with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
003 procedure putwage is
004 type Age is range 1 .. 100;
005 type Wage is range 1 .. 100;
006 Bill_Age : Age := 56;
007 Bill_Wage: Wage := 56;
008 begin
009 Put ("Total wage is");
010 Put (Bill_Wage * Bill_Age);
011 New_Line;
012 end putwage;
[001]-[002]: 使用软件包 Ada.Text_IO,Ada.Integer_Text_IO;两个软件包分别处理字符类输出和整数输出。
[003] [008] [012] 定义一个过程 putwage。
[004]-[005]: 定义新的数据类型Age,Wage,它们取值范围都为 1..100。
[006]-[007]: 声明两个变量 Bill_Age,Bill_Wage,类型分别为 Age 和Wage, 并赋予相同初始值56。
[009]-[011]:依次输出字符串"Total wage is",整数 Bill_Wage和Bill_Age的乘积,和一个新行符(EOL)。
以上程序看上去毫无问题,但根本无法编译通过。首先,没有定义类型Age和wage的 * 操作,因此Bill_Age和Bill_Wage无法相乘;第二,两者数据类型不同,即使定义了*操作,还是无法相乘。 当然也可使用后面提到的类型转换 ,如果将[010]改为Put (Integer(Bill_wage) * Integer(Bill_Age)),将会输出所要的 3136;但如果改成Put (Integer(Bill_wage * 56)),看上去也行的通,但实际结果却不是3136。不同数据之间不能进行运算,要牢牢记住。(Integer 是预先定义的一个整型,Integer(Bill_Wage)是将Bill_Wage强制转换为整型)。