10.7 体现代码优美的数据类型——枚举类型

枚举类型是一种需要编程者自己构造的数据类型,本质上属于“整数类型”的一种。这种数据类型的特点是数据的值是“int”类型的一个“小”子集。

因为是“int”的一个“小”子集,所以其值可以被容易地一个一个地罗列出来,同时可以用具有明显含义的符号常量来表示这些值。显然这样将使代码的可读性得到加强。

构造一个数据类型需要首先对类型进行声明,其目的是帮助编译器理解这种构造数据类型。C语言声明枚举类型需要用到关键字enum。声明枚举类型的方法通常是:

10.7 体现代码优美的数据类型——枚举类型 - 图1

枚举类型的附加标识(tags)的作用是区别各个不同的枚举类型。如果代码中只有一种枚举类型时,可以不写这个枚举类型的附加标识,但这种偷懒的做法虽然可以被编译器所容忍,却不是一种良好的编程风格。

枚举类型的附加标识按照标识符法则命名。关键字enum枚举类型的附加标识共同组成了这种构造类型的类型名字。

{}”里面的“枚举常量列表”是若干被“,”分隔开的一个个的符号常量,有时这些符号常量也被称之为这种枚举类型的成员(member)。例如:

10.7 体现代码优美的数据类型——枚举类型 - 图2

1 在C99中也可以写成enum shifou{FOU, SHI,};

这个类型声明定义了一种类型名为“enum shifou”的枚举类型,这种类型的数据可以取值为“FOU”或“SHI”,这里“FOU”或“SHI”都是“int”,类型的符号常量。

枚举常量列表”中各个枚举常量的值,除非特别指定,否则首个枚举常量的值总是0,后一个枚举常量的值总是比前一个大1。前面例子中的“FOU”的值是0,而“SHI”的值为1。下面是指定枚举常量值的例子。

10.7 体现代码优美的数据类型——枚举类型 - 图3

这种枚举类型的成员YI、ER、LIU、QI的值分别为1、2、6、7。

由于enum枚举类型的附加标识共同组成了枚举类型的类型名字,因而可以用这种类型的名字来定义这种类型的变量。如:

10.7 体现代码优美的数据类型——枚举类型 - 图4

当然,也可以把枚举类型的定义与枚举变量的定义写在一起。如:

10.7 体现代码优美的数据类型——枚举类型 - 图5

这种枚举类型在C语言诞生之初是没有的,后来是为了增加程序的可读性而在C语言标准中加入的。由于枚举类型只是一种可读性更好的“int”类型,因此不难发现,没有这种类型,代码也可以完成同样的功能,但是在一定的条件下及适当的场合中,应用这种枚举类型可以使得代码显得更顺畅、自然、优美。然而单独使用这种类型却很难达到这种效果,下面是一个例子。

例题:口袋中有红、黄、蓝、白、黑5种颜色的球各若干个,每次从口袋中取出3个,问得到3种不同颜色的球的可能取法,打印出每种组合的3种颜色。

程序代码10-9

10.7 体现代码优美的数据类型——枚举类型 - 图6

10.7 体现代码优美的数据类型——枚举类型 - 图7

除了可以增强代码的可读性和美感,枚举类型对于程序的调式也很有意义。这是它与用预处理命令定义的符号常量最大的不同。符号常量在编译前已经被替换掉了,因而在运行程序时没有相关的信息。

对于C++语言有所了解的人需要特别注意,C语言中的枚举类型与C++是不同的。简单地说,C++不容许这种类型的变量越雷池一步——即不容许取枚举常量之外的值,这极大地限制了枚举类型的灵活使用。因此在C++中使用枚举类型,通常会有一种束手束脚的感觉。但在C语言中枚举类型是与“int”类型相容的。