C语言枚举类型(enum)的定义、赋值和使用
C语言枚举类型的定义
1) 枚举类型定义的一般形式
C语言中提供的定义枚举类型的语句格式如下。enum 枚举名 { 枚举值表 };
在枚举值表中罗列出所有可用的值,这些值也称为枚举元素,元素之间用逗号分隔开。例如,定义一个性别的枚举类型:enum sex { male, female};
其中 sex 为枚举类型名,其元素有两个。凡被说明为 sex 类型的变量的值只能是 male 和 female 两个值中的一个。再例如,定义一个星期的枚举类型:
enum weekday{sun, mon, tue, wed, thu, fri, sat};
其中 weekday 为枚举类型名,其元素有 7 个。凡被说明为 weekday 类型的变量的值只能是 sun、mon、tue、wed、thu、fri、sat 这 7 个值中的一个。2) 枚举变量的说明
如同结构体和共用体,枚举变量也可以用不同的方式说明,即先定义后说明,或者定义的同时直接说明。例如,设变量 a、b 和 c 都是 weekday 类型的变量,可用下面任意一种方式。
enum weekday{sun, mon, tue, wed, thu, fri, sat};
enum weekday a,b,c;
enum weekday{sun, mon, tue, wed, thu, fri, sat} a,b,c;
或者:enum {sun, mon, tue, wed, thu, fri, sat} a,b,c;
3) 枚举变量的赋值和使用
枚举类型的数据在应用中有以下规定。①枚举元素值是常量、不是变量,一旦定义,不能在程序中对枚举元素重新赋值。
例如,对上例中的 weekday 的元素做以下操作是错误的。
sun=9;
sun=mon;
②枚举元素本身由系统定义了一个表示序号的数值,从 0 开始,顺序定义为 0,1,2……例如,对上例中的 weekday 中的元素,sun 值为 0,mon 值为 1,tue 值为2……sat 值为 6。
③只能把枚举元素值赋给枚举变量,不能把元素的序号值直接赋给枚举变量。
例如,上例中已经说明了“enum weekday{sun,mon,tue,wed,thu,fri,sat}a,b,c;”,则下面操作是正确的。
a=sun; // 给 a 赋值为星期日
b=sat; // 给 b 赋值为星期六
a=0;
b=6;
a=( enum weekday)0;
其作用是将序号为 0 的枚举元素赋给变量 a,相当于 a=sun。提示:枚举元素不是字符常量也不是字符串常量,使用时不能加单引号或者双引号定界符。
C语言枚举类型的应用
【示例1】根据枚举类型中颜色元素的序号值输出对应的颜色是什么。C语言代码如下:#include<stdio.h> int main() { enum color{red,yellow,green,blue,black} user_color; /*定义枚举类型color,声明变量user_color*/ int i=1; /*定义循环条件变量i */ while(i) { printf("\n有五种颜色:red,yellow,green,blue,black \n "); printf("请输入你选择颜色的序号(0~4,其他数值退出): "); scanf("%d",&user_color); switch(user_color) { case red: printf("\n你选择的是:红色\n"); break; case yellow: printf("\n你选择的是:黄色\n"); break; case green: printf("\n你选择的是:绿色\n"); break; case blue: printf("\n你选择的是:蓝色\n"); break; case black: printf("\n你选择的是:黑色\n"); break; default: i=0; } printf("\n"); } return 0; }运行结果:
有五种颜色:red,yellow,green,blue,black
请输入你选择颜色的序号(0~4,其他数值退出): 2
你选择的是:绿色
有五种颜色:red,yellow,green,blue,black
请输入你选择颜色的序号(0~4,其他数值退出): 0
你选择的是:红色
有五种颜色:red,yellow,green,blue,black
请输入你选择颜色的序号(0~4,其他数值退出): 6
我们知道在 switch-case 多分支结构中 case 关键字后面必须是一个整数常量或字符常量,或者是结果为整数的表达式,但不能包含任何变量,正是由于 red、yellow、green、blue、black 这些名字最终会被替换成一个它们所在位置序号所对应的整数,所以它们才能放在 case 后面。
高手点拨
在定义枚举类型时,枚举元素列表中每个元素的序号只能是整型,如果我们不指定某个元素的序号是多少,系统默认是从 0 开始排列。【示例1】中的 color 枚举列表中 red=0、yellow=1……black=4,而在 case 后面的代码我们看到是红色、黄色,而不再用序号表示,通过这个例子我们可以得出枚举元素本质就是一个有序的数值。
如果我们想把第一个元素的序号指定为从 1 开始计数可以吗?通过下面的定义就可以实现:
enum weekday{sun=1, mon, tue, wed, thu, fri, sat};
如果指定了部分枚举常量的序号值,那么未指定值的枚举常量的序号值将依着最后一个指定值向后递增,步长为 1。在应用C语言枚举类型时需要注意以下几点:
- 不能对枚举常量进行赋值操作(定义枚举类型时除外);
- 枚举常量和枚举变量可以用于判断语句,实际用于判断的是其中实际包含的元素序号值;
- 一个整数不能直接赋值给一个枚举变量,必须用该枚举变量所属的枚举类型进行强制类型转换;
- 使用常规的手段无法输出枚举常量所对应的字符串,因为枚举常量为整型值;
- 在使用枚举变量的时候,我们不关心其值的大小,只是关心其表示的状态,即其值的含义是什么。
声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。