首页 > 编程笔记

C语言枚举类型(enum)的定义、赋值和使用

C语言中,如果一个变量只有几种可能存在的值,并且每个值都可以用一个名字表示出来,那么就能够定义成枚举类型。之所以叫枚举就是因为可以将变量可能存在的情况一一列举出来。

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语言枚举类型时需要注意以下几点:

优秀文章