2.5 枚举
枚举是基本数据类型之一,有的资料中也把它称为复合数据类型。它是一组被命名的整型常数,枚举类型在工程中应用非常广泛。
2.5.1 枚举的定义
在实际应用中,某些变量需要被限定在一定的范围内。如世界有七大洲,地球有24小时,一周有7天,一年有12个月等等。这些范围很难以整型、实型或字符型加以说明。因此,为满足表达某组数据表列的需求,C语言提供了枚举类型。
枚举类型的定义使用关键字enum,其一般形式为:
enum用户标识符 { 枚举参数表列 };
用户标识符即指枚举名,在枚举参数表列中应罗列出所有需要的值,这些值也称为枚举元素。例如:
enum world { Asia, Europe, Africa, NorthAmerica, SouthAmerica, Oceania, Antarctica };
该枚举类型名为world,共有7个枚举值。凡被声明为为world类型的枚举变量,取值只能为枚举参数表列之一。
2.5.2 枚举变量的定义与使用
枚举变量可以先定义后声明,也可以在定义枚举类型时同时声明枚举变量。仍然以七大洲名称为例,如下形式为定义枚举类型的同时声明枚举变量x,y,z。
enum world { Asia, Europe, Africa, NorthAmerica, SouthAmerica, Oceania, Antarctica }x,y,z;
如下形式为先定义枚举类型,后声明枚举变量。
enum world { Asia, Europe, Africa, NorthAmerica, SouthAmerica, Oceania, Antarctica }; enum world x,y,z;
需要说明的是,枚举参数表列中的值为常量,不是变量,因此其值不能被修改。对枚举world中的元素进行如下操作是非法的。
Asia = 1; Oceania = 2;
若程序中在定义枚举类型时没有对元素进行值对应,系统会自动为枚举类型的每个元素顺序编号,并从0开始递增赋值,如上述定义中Asia的值为0,Europe的值为1,Antarctica的值为6。
枚举可在定义时对元素进行值对应,通常也称为将某个值赋给元素。
范例2.20 EnumValueTest.c
EnumValueTest.c假定各大洲每年的工业产值单位为万亿元,定义枚举类型数据,用于存储各大洲的工业产值状况,例如,亚洲为500万亿元。(光盘\chat2\ EnumValueTest.c)
01 #include<stdio.h> 02 main() 03 { 04 enum world //定义枚举类型world 05 { 06 Asia=500, //枚举元素赋值 07 Europe, 08 Africa=-100, //枚举元素Africa赋初值 09 SouthAmerica, 10 NorthAmerica=800, 11 Oceania=66, //枚举元素Oceania赋初值 12 Antarctica 13 }; 14 enum world en1,en2,en3,en4,en5,en6,en7,en_calc; //声明枚举变量 15 en1=Asia; //枚举变量赋值 16 en2=Europe; 17 en3=Africa; 18 en4=NorthAmerica; 19 en5=SouthAmerica; 20 en6=Oceania; 21 en7=Antarctica; 22 en_calc=en1+en2+en3+10; //枚举变量运算 23 printf("en1=%d,en2=%d,en3=%d,en4=%d,en5=%d,en6=%d,en7=%d", 24 en1,en2,en3,en4,en5,en6,en7); //输出枚举变量的值 25 printf("en_calc=%d\n",en_calc); 26 }
程序第6行首先将整数500赋给枚举元素Asia,因此元素Europe将在前一元素基础上增1,变为501。元素Africa被赋值为-100之后,元素SouthAmerica变为-99,同时NorthAmerica重新赋值为800。同样,元素Oceania被赋值为66之后,Antarctica变为67,而经过第22行算术运算之后,en_calc的值变为901。程序运行输出结果为:
en1 = 500, en2 = 501, en3 = -100, en4 = -99, en5 = 800, en6 = 66, en7 = 67 en_calc = -79
作者心得:
枚举类型元素不能赋值为实型常量,如程序中第6行改为Asia = 500.5,程序将出现编译错误。也不能试图在枚举定义之后修改元素的值,若在程序21行后添加:Asia = 10,程序同样会出现非法错误,原因是Asia是一个常量,其值不允许再次改变。