5.5.2 枚举变量的赋值和使用

在声明枚举类型时,如果没有进行初始化赋值,即省略“标识符[=整型常量]”不写,则系统会自动赋给一个表示序号的数值,枚举元素从0开始顺序赋值为0、1、2等。如果枚举中的某元素被赋值,其后的枚举元素按依次加1的规则,确定其值。

例如,在声明枚举类型weekday中,没有进行初始化,系统便依次定义Monday值为0,Tuesday值为1,……,Sunday值为6。程序示例如下。


include<stdio.h>//头文件

void main()//主函数

{

enum weekday//声明枚举类型

{

Monday,//枚举元素0,星期1

Tuesday,//枚举元素1,星期2

Wednesday,//枚举元素2,星期3

Thursday,//枚举元素3,星期4

Friday,//枚举元素4,星期5

Saturday,//枚举元素5,星期6

Sunday,//枚举元素6,星期7

}a,b,c;//声明枚举变量

a=Monday;//变量赋值

b=Saturday;

c=Sunday;

printf(“a=%d,b=%d,c=%d\n”,a,b,c);//输出结果

}


该程序可以在KeilµVision3编译环境中执行,运行的结果如下。


a=0,b=5,c=6


本例中,先声明了枚举类型weekday,同时声明了枚举变量a、b和c。接着,对将枚举元素的值分别赋给枚举变量,并打印输出其结果。因为枚举类型weekday没有进行初始化,所以采用系统默认赋值,即0~6。

在程序中使用枚举类型时,要注意以下几点。

❑枚举元素值是常量,而不是变量。不能在程序中用赋值语句再对其进行赋值或修改。例如,对上例中声明的枚举weekday的枚举元素,进行以下赋值操作。这些语句都是错误的。


Sunday=5;//错误

Monday=2;//错误

Sunday=Monday;//错误


❑只能把枚举元素赋值给枚举变量,而不能直接把枚举元素的值赋给枚举变量,示例如下。


a=Sunday;b=Monday;//是正确的

a=6;b=0;//是错误的。虽然Sunday的值为6,Monday的值为0


如果一定要强调把枚举元素的数值赋给枚举变量,则必须用强制类型转换,示例如下。


a=(enum weekday)3;


等价于如下形式。


a=Thursday;


❑枚举元素不能是字符常量,也不能是字符串常量。因此定义枚举元素用时,不要加单、双引号。

❑对枚举元素进行赋值时,可以为其赋值为负数,被赋值的枚举元素其后的成员按依次加1的规则,确定其值。程序示例如下。


include<stdio.h>//头文件

void main()//主函数

{

enum//声明枚举和枚举变量

{

t1,

t2=-3,//枚举元素赋初值

t3,

t4=11,

t5,

}t;

t=t1;//枚举变量赋值

printf(“t1=%d\n”,t);//输出结果

t=t2;//枚举变量赋值

printf(“t2=%d\n”,t);//输出结果

t=t3;//枚举变量赋值

printf(“t3=%d\n”,t);//输出结果

t=t4;//枚举变量赋值

printf(“t4=%d\n”,t);//输出结果

t=t5;//枚举变量赋值

printf(“t5=%d\n”,t);//输出结果

}


该程序可以在KeilµVision3编译环境中执行,运行的结果如下。


t1=0

t2=-3

t3=-2

t4=11

t5=12


本例中,首先声明了枚举变量t,因为第一个枚举元素t1未赋值,所以默认值为0;枚举元素t2赋了初值-3;枚举元素t3未赋值,其值为t2+1=-2;枚举元素t4赋了初值11;枚举元素t5未赋值,其值为t4+1=12。最后,分别对t进行赋值,并打印输出其结果。