9.4 枚举类型

一个变量只有几种可能的取值,可以一一列举出来,变量的取值仅限于列举的值的有限范围内,而不适宜用整型、实型、字符型直接表示,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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值