1.12 枚举
枚举,从字面来理解,就是一一列举。而在C语言中有一种枚举类型,其含义就是将具有相同属性的一类数据一一列举出来。
定义枚举类型的一般形式为:
enum枚举类型名{
标识符1[=整型常数],
……
标识符n[=整型常数],
};
其中,[]中的部分可有可无。枚举类型是有序类型,如果没有为枚举常量指定值,那么它的值比前一个值大1,枚举常量的值默认从0开始。枚举元素按照定义时的先后顺序分别编号为0,1,2,……,n-1。当然,也可以人为指定枚举类型常量的值。枚举类型名的命名同样要遵循标识符的命名规则,而其中的标识符1,2,……,n是定义的枚举类型的全部取值。定义枚举类型的几种方法与上面的结构体和共用体的定义方法类似,有以下三种。
enum枚举类型名{
标识符1[=整型常数],
……
标识符n[=整型常数],
}枚举变量1,枚举变量2……;
也可以省略枚举类型名,如:
enum{
标识符1[=整型常数],
……
标识符n[=整型常数],
}枚举变量1,枚举变量2……;
还可以采用先定义枚举类型,后定义枚举变量的方法,如:
enum枚举类型名{
标识符1[=整型常数],
……
标识符n[=整型常数],
};
enum枚举类型名枚举变量1,枚举变量2……;
介绍完枚举类型的几种定义方法,下面通过代码进一步了解枚举类型。
include<stdio.h>
enum nu1{
a,
b,
c,
d,
};
enum nu2{
e=3,
f=2,
g=1,
h,
};
void main()
{
printf("枚举类型常量a的值为:%d b的值为:%d c的值为:%d d的值为:%d\n",a,b,c,d);
printf("枚举类型变量e的值为:%d f的值为:%d g的值为:%d h的值为:%d\n",d,f,g,h);
return;
}
运行结果:
枚举类型常量a的值为:0 b的值为:1 c的值为:2 d的值为:3
枚举类型变量e的值为:3 f的值为:2 g的值为:1 h的值为:2
分析上面的运行结果,在定义的枚举类型nu1中,我们没有指定枚举常量的值,而是采用默认的方法,打印出来的结果与前面分析的一致,从0开始,后面的枚举常量的值比前面的枚举常量的值大1;在枚举类型nu2中,我们指定了枚举常量的值,所以打印出来的结果就是指定的值,但是没有指定最后一个枚举常量的值,所以它比前面的枚举常量的值大1。
使用枚举类型时需要注意,在同一个作用域内不能出现重名的枚举常量名,如:
include<stdio.h>
void main()
{
enum nu1{
a,
};
enum nu2{
a,
};
return;
}
编译上面这段代码时会出现错误,提示信息为“error C2371:'a':redefinition;different basic types”。如果修改一下上面这段代码,把枚举类型nu2的作用域用一个{}限制起来就不会出错了,如:
include<stdio.h>
void main()
{
enum nu1{
a,
};
{
enum nu2{
a,
};
}
return;
}
这样就不会出错了,因为将枚举类型nu2的作用域限制在{}范围内,而枚举类型nu1的作用域是整个main()函数体。而对结构体和共用体,则没有这样的要求。