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()函数体。而对结构体和共用体,则没有这样的要求。