点击量:8
定义一种新的数据类型 – 枚举型
enum DAY { MON, TUE, WED, THU, FRI, SAT, SUN };
上面的代码中是enum的基本定义形式,声明DAY为新的数据类型,称为枚举(enumeration);
其中MON, TUE, WED, THU, FRI, SAT, SUN将默认的定义为0,1,2,3,4,5,6. 像MON,TUE。。。。。等被称为枚举量。
接着用DAY来声明变量如:DAY day; 就像int a一样使用。接着可以day=MON,这个时候day的之为0,但是注意的是这里的day无法被赋予整数型,例如day=10,这是不允许的,此时的day只能用MON,YUE—SUN来进行赋值。但是像int a = MON这种行为是被允许的,枚举量是符号常量,这里的赋值编译器会自动把枚举量转换为int类型。一句话枚举量自生的值是无法改变的,像MON++,day=MON+TUE,都是不允许的。总结:对于枚举,只定义了赋值运算符,没有为枚举定义算术运算。枚举量只能用{}内的枚举量来定义。
在不进行强制转换的前提下,只能将定义的枚举量赋值给该种枚举的变量,言下之意就是可以通过强制转换将其他类型值赋给枚举变量:
Weekday = enumType(2);
等同于:
Weekday = Wednesday;
但是,如果试图将一个超出枚举取值范围的值通过强制转换赋给枚举变量,会出现什么结果?
Weekday = enumType(20);
结果将是不确定的,这么做不会出错,但得不到想要的结果。
自定义枚举量的值:
-
前面讲通过定义
enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
枚举量Monday、Tuesday等的值默认分别为0-6,我们可以显式的设置枚举量的值:
enum enumType {Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7};
指定的值必须是整数!
-
也可以只显式的定义一部分枚举量的值:
enum enumType {Monday=1, Tuesday, Wednesday=1, Thursday, Friday, Saturday, Sunday};
这样Monday、Wednesday均被定义为1,则Tuesday=2,Thursday、Friday、Saturday、Sunday的值默认分别为2、3、4、5.
总结:未被初始化的枚举值的值默认将比其前面的枚举值大1
第二条还说明另外一个现象,就是枚举量的值可以相同。
枚举的取值范围:
前面讲到可以通过强制转换将其他类型值赋给枚举变量:
Weekday = enumType(2);
这是合法的;但是
Weekday = enumType(20);是非法的。
这里涉及枚举取值范围的概念:
枚举的上限是 大于最大枚举量的 最小的2的幂,减去1;
枚举的下限有两种情况:一、枚举量的最小值不小于0,则枚举下限取0;二、枚举量的最小值小于0,则枚举下限是 小于最小枚举量的 最大的2的幂,加上1。
举例来讲:
假如定义 enum enumType1 { First=-5,Second=14,Third=10 };
则枚举的上限是16-1=15(16大于最大枚举量14,且为2的幂);
枚举的下限是-8+1=-7(-8小于最小枚举量-5,且为2的幂);
枚举的应用:
#include<stdio.h> enum Season { spring, summer=100, fall=96, winter }; typedef enum { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }Weekday; int main() { /* Season */ printf('%d ', spring); // 0 printf('%d, %c ', summer, summer); // 100, d printf('%d ', fall+winter); // 193 Season mySeason=winter; if(winter==mySeason) printf('mySeason is winter '); // mySeason is winter int x=100; if(x==summer) printf('x is equal to summer '); // x is equal to summer printf('%d bytes ', sizeof(spring)); // 4 bytes /* Weekday */ printf('sizeof Weekday is: %d ', sizeof(Weekday)); //sizeof Weekday is: 4 Weekday today = Saturday; Weekday tomorrow; if(today == Monday) tomorrow = Tuesday; else tomorrow = (Weekday) (today + 1); //remember to convert from int to Weekday return 0; }