第三讲 enum精讲

--write by zhuwx 2019-06-24 20:58:19 +0800 CST

点击量: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};

    指定的值必须是整数

  • 2

    也可以只显式的定义一部分枚举量的值:

    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;
}