预计阅读本页时间:-
可以使用枚举类型(enumerated type)声明代表整数常量的符号名称。通过使用关键字enum,可以创建一个新“类型”并指定它可以具有的值(实际上,enum常量是int类型的,因此在使用int类型的任何地方都可以使用它)。枚举类型的目的是提高程序的可读性。它的语法与结构的语法相同。例如,可以使用这样的声明:
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
第一个声明设置spectrum为标记名,从而允许您把enum spectrum作为一个类型名使用。第二个声明使得color成为该类型的一个变量。花括号中的标识符枚举了spectrum变量可能有的值。
因此,color的可能值是red、orange, yellow,等等。然后,可以使用如下所示的语句:
虽然枚举常量都是int类型的,但枚举变量较宽松地限定为任一种整数类型,只要该整数类型能保存这些枚举常量。例如,为spectrum枚举的常量在范围0到5之间,因此编译器可以选择使用unsigned char来表示变量color。
顺便提一下,C的某些枚举属性不能延至C++中。例如,C允许对枚举变量使用运算符++,而C++不允许。因此,如果您的代码有可能会被加入C++程序中,那么在上面的例子中,您必须把color声明为int类型。这样该代码就既能工作在C下,也能工作在C++下。
14.11.1 enum常量
blue和red到底是什么?从技术上讲,它们是int类型的常量。例如,假设有前面的枚举声明,可以这样使用:
下面是输出:
所发生的情况是red成了一个代表整数0的命名常量。同样,其他标识符也是代表1到5的命名常量。在使用整数常量的任何地方都能使用枚举常量。例如,在数组声明中可以把它们作为数组大小,在switch语句中,可用它们来作为标签。
14.11.2 默认值
默认时,枚举列表中的常量被指定为整数值0、1、2等等。因此,以下声明使nina具有值3:
14.11.3 指定值
您可以选择常量具有的整数值。只须在声明中包含期望的值:
如果只对一个常量赋值,而没有对后面的常量赋值,那么这些后面的常量会被赋予后续的值。例如,假设有这样的声明:
那么,cat的值默认为0, lynx、puma和tiger的值分别是10、11和12。
14.11.4 enum用法
回忆一下,枚举类型的目的是提高程序的可读性。如果是处理颜色,采用red和blue要比使用0和1更显而易见。注意,枚举类型是内部使用的。如果想输入color值orange,只能输入1,而不是单词orange。或者,可以读入字符串“orange”,并让程序将它转换成值orange。
因为枚举类型是一个整数类型,所以enum变量能像整数变量那样被用在表达式中。这就给case语句提供了一类方便的标签。
程序清单14.15给出了一个使用enum的短例。该示例程序中使用默认值方案,将值0赋给red,使它成为指向字符串“red”的指针的索引。
程序清单14.15 enum.c程序
如果输入的字符串与一个由colors数组成员指向的字符串相匹配,程序就跳出for循环。如果该循环找到一个匹配的颜色,程序就用那个枚举变量的值去匹配用作case标签的枚举常量。下面是一个运行示例:
14.11.5 共享的名字空间
C使用术语名字空间(namespace)来表示识别一个名字的程序部分。作用域是这个概念的一部分;名字相同但具有不同作用域的两个变量不会冲突;而名字相同并在相同作用域中的两个变量就会冲突。名字空间是分类别的。在一个特定作用域内的结构标记、联合标记以及枚举标记都共享同一个名字空间,并且这个名字空间与普通变量使用的名字空间是不同的。这意味着,可以在同一个作用域内对一个变量和一个标记使用同一个名字,而不会产生错误;但是不能在同一作用域内使用名字相同的两个标记或名字相同的两个变量。例如,在C中下面的语句不会产生冲突:
然而,用两种不同的方式使用同一标识符会造成混乱;而且,C++不允许在同一个作用域内对一个变量和一个标记使用同一个名字,因为它把标记和变量名放在同一个名字空间中。