C语言程序设计案例精粹
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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是一个常量,其值不允许再次改变。