1. 枚举的原理
-
枚举(enumeration)
列出类型值域中所有元素的处理方式。 -
枚举类型(enumeration type)
通过列出它的所有元素来定义的类型。 -
整数编码(integer encoding)
为枚举类型的每个元素赋一个整数值的过程。
1.1 将枚举类型表示为整数
表示C语言中的枚举类型,一种方法是:
显式地用int
类型,然后用#define
功能引入一些新的常量名。
例如,定义每周中的每一天的名字:
#define Sunday 0
#define Monday 1
#define Tuesday 2
#define Wednesday 3
#define Thursday 4
#define Friday 5
#define Saturday 6
int weekday;
weekday=Monday;
1.2 定义新的枚举类型
定义新的枚举类型的语法形式:
例如,引入枚举类型来定义一周中每天的名字:
typedef enum
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
} weekdayT;
这个定义引入了一个新的类型weekdayT
,它在程序中可以和其他类型一样使用,如int
和bool
。
名字结尾处的大写字母T强调名字weekdayT
是一种类型,而不是一个变量。
在程序中使用枚举类型的好处在于该类型名能传递一些有用的信息。
将一个变量声明为int
类型会使任何一个读此程序的人认为该变量保存的是整数;该整数代表的是一个星期中的某一天的功能完全丧失了。
在定义报税身份类型时,需要指定常量的值,如下所示:
typedef enum
{
Single = 1,
MarriedFillingJointReturn = 2,
MarriedFillingSeparateReturn = 3,
HeadOfHousehold = 4,
QualifyingSurvivingSpouse = 5
} fillingStatusT;
该定义可作进一步简化。若无等号,编译器依次对每一个元素连续赋值:
typedef enum
{
Single = 1,
MarriedFillingJointReturn,
MarriedFillingSeparateReturn,
HeadOfHousehold,
QualifyingSurvivingSpouse
} fillingStatusT;
1.3 枚举类型的操作
一旦在表达式中用到枚举类型的值时,C编译器自动将它转换为整数。
因为每个枚举常量都用一个整数值表示,所有涉及枚举类型的计算只是用到它的整型代码代替。
例如:
#include <stdio.h>
typedef enum
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
} weekdayT;
main() {
int day;
weekdayT weekday;
weekday = Saturday;
printf("%d\n", weekday);
}
6
注意:
在C语言中,使用枚举类型时要非常小心,因为编译器不检查计算的结果是否是某一枚举类型的合法成员。
例如:
weekday = weekday + 1;
如果weekday的值碰巧为Saturday,将取表示Saturday的值6,对它加1,把这个值7存回到变量weekday,尽管7不是weekdayT
类型的合法元素。
1.4 标量类型
行为类似于整数的类型,如枚举类型,称为标量类型(scalartype) 。
在C语言中,当在表达式中使用标量类型时,它们被自动转换为整数。
此外,标量类型可以用在任何整数类型出现的地方。
假设directionT
被定义为:
typedef enum
{
North,
East,
South,
West
} directionT;
函数返回参数指定的方向的反方向:
directionT OppositeDirection(directionT dir) {
switch (dir) {
case North: return South;
case East: return West;
case South: return North;
case West: return East;
default: printf("Illegal direction value.");
}
}
调用OppositeDirection(North) 将返回South。
参考
《C语言的科学和艺术》 —— 第9章 字符串和字符