一个变量只有几种可能的取值,可以一一列举出来,变量的取值仅限于列举的值的有限范围内,而不适宜用整型、实型、字符型直接表示,C语言提供了这种枚举数据类型。例如,一年的四季有春夏秋冬;一个星期有星期日、星期一到星期六等。
9.4.1 枚举类型的定义
定义枚举类型的一般形式为:
enum [枚举类型名]
{
枚举类型1[ = 整型常量], 枚举类型2 [ = 整型常量],......
};
如:
enum weekday {sun, mon, tue, wed, thu, fri, sat};
9.4.2 枚举类型变量的说明及其使用
1. 枚举变量的定义
与结构体、共用体、位子段一样,它也存在 3 种定义方式(间接、直接、无名定义)。
如:间接定义枚举变量形式:
enum weekday day;
直接定义枚举变量形式:
enum weekday {sun, mom, tue, wed, thu, fri, sat} day;
无名定义枚举变量形式:
enum {sun, mon, tue, wed, thu, fri, sat} day;
定义枚举类型变量之后,就可以为它们赋枚举元素的值。如 day = fri;
枚举类型数据使用的几点说明:
(1)enum 是定义枚举类型的保留字,花括号内是列举出来的枚举元素,“整型常量”为枚举元素的序号初值,常常可以省略。
(2)上面我们定义了一个枚举类型 weekday ,它包含了 sun, mon, tue, wed, thu, fri, sat 7个枚举常量。在说明枚举类型的同时,编译程序按顺序给每个枚举元素一个对应的序号,也就是“整型常量”,系统默认序号的值从 0 开始,后续元素顺序加 1 。 也可以在定义时人为指定枚举元素的序号值,如:
enum { sun = 7, mon = 1, tue, wed, thu, fri, sat } day;
没有指定序号值的元素则在前一元素序号值的基础上加 1 。
(3)枚举值又称为枚举元素或枚举常量,也是用户定义的标识符,并不一定用 sun 就表示星期日,也可以用其他的标识符来表示,它们只作为枚举类型变量取值的可选项并应该是有限个。同时在程序中不能对枚举元素赋值,如 sun = 4,mon = 5;是非法的语句。
(4)枚举值可以进行加(减)一个整数 n 的运算,用以得到其后(前)第 n 个元素的值。
(5)枚举值可以按定义时的序号进行关系比较,如:if (day == mon) … 其实是根据枚举元素的序号值进行判定的。
(6)只能给枚举变量赋枚举值,若赋序号值则必须进行强制类型转换,如:day = 2;是非法表示,应该用 day = (enum weekday)2; 表示,相当于 day = tue;
(7)枚举变量也可以做函数的参数或函数的返回值。
2. 枚举变量的使用
例9.9 设某月的第一天是星期一,输入该月的任意一天,输出这天是星期几。
具体程序如下:
#include "stdio.h"
void main() {
enum weekday {sun, mon, tue, wed, thu, fri, sat}d[32],n;
/* 注意:此处定义的是枚举类型的 d 数组和枚举类型的 n 变量 */
int i,j;
n = mon; /* 注意变量 n 的取值,只能取枚举值 */
for (i = 1; i < 32; i++) { /* 循环内完全是枚举变量的操作,为每一天赋相应星期值 */
d[i] = n;
if (n == sat) n = sun;
else n++;
}
printf("\n input day: ");
scanf("%d", &j);
printf("\n");
switch(d[j]) {
case sun: printf("%3d is Sunday\n",j);break;
case mon: printf("%3d is Monday\n",j);break;
case tue: printf("%3d is Tuesday\n",j);break;
case wed: printf("%3d is Wednesday\n",j);break;
case thu: printf("%3d is Thursday\n",j);break;
case fri: printf("%3d is Friday\n",j);break;
case sat: printf("%3d is Saturday\n",j);break;
default: break;
}
getchar();
}
运行结果:
input day: 21
21 is Sunday