8.2 枚举值

有时我们想让程序或函数中的某个变量只能在有限的几个值里面挑选。为了更清楚地表达这种想法,我们会给每个值都赋予相应的名字,这样就会形成一套名称,这套名称所表示的是一组相互关联的值。

比方说,我们想用一个变量来表示某张扑克的花色。平常玩牌的时候,我们会用某种花色的名字来指代这种花色,例如黑桃(spade)、红桃(heart,又叫红心)、梅花(club,又叫草花)、方块(diamond,又叫方片)。然而C语言本身并没有花色这个概念,因此,我们需要把每个花色与一个表示该花色的值对应起来,这个值可以由我们自己选,例如用4表示黑桃,用3表示红桃,用2表示方块,用1表示梅花。设计好这样的对应关系之后,我们就可以像下面这样写代码了:

然而这样做有一个问题,就是必须记住每个值所对应的花色。这是一个比较容易出错的地方。

除此之外,我们还有一种办法,就是通过预处理指令定义一组用来表示花色名称的符号,让这些符号分别与相关的常量值对应起来:

另外还有第三种方案,也就是定义四个常变量(简称常量),让它们的名称能够表示相应的花色,并把四个不同的整数值分别设置成这四个常量的初始值:

1、2、3、4这四个值虽然能够准确地跟相关花色对应起来,但它们之间毕竟是没有联系的,由于card变量是int型,因此它除了可以取这四个值之外,还可以取其他int值,于是,我们有时很难判断card变量的取值到底表示哪种花色,也不知道它表示的是不是有效的花色。例如card变量可以取1~4之外的其他整数,在那种情况下,它的值是没有意义的。

C语言提供了一种机制,让我们可以明确表达这些值之间的相互关系,并且让这种类型的变量只能在这一组值里面挑选,也就是说,它只能取这组值里面的某一个值[1],而不能取范围之外的其他值。

[1] 原文如此,但目前的C语言从自身语法层面上似乎很难做到。后面出现的类似说法,也应该这样理解。——译者注