枚举

C++的枚举工具提供了另一种创建符号常量的方式,这种方式可以代替const。还允许定义新类型,但必须按严格的限制执行。使用enum的句法与struct类似。

enum color { red, orange, blue, green, red, black}

这条语句定义了一个名为color的新类型,它的取值范围为red, orange, blue, green, red, black,称为符号常量,同时将0~5分别对应于red~black。在默认情况下,0对应的是red,5对应的是black,其他以此类推。

声明与使用

1
2
3
4
color cor1; //定义了一个类型为color的变量cor1
//枚举变量的赋值
cor1 = red; //正常赋值
cor1 = 20; //非法,20不是枚举变量

由此可以看出,枚举变量的赋值受到限制,与程序员的定义有关。

  • 对枚举而言,它的操作符只有赋值运算符=,这就意味着枚举变量不能执行++、--、+、—等号以外的操作。

  • 枚举量是整形,可被提升为int类型,但int类型不能自动转换为枚举类型

  • 枚举可以进行强制类型转换,但不确定其结果,如cor1 = spectrum(100);
  • 如果只打算使用常量,而不创建枚举类型的变量,则可以省略枚举类型的名称 enum {red,orange}

设置枚举的值

可以使用赋值运算符显式地来设置枚举量的值:

1
enum bits {one = 1, two = 2, three = 3};

但是,指定的值必须是整数。也可以只显式的设置其中一部分的值,默认情况下,枚举的 第一个常量始终是从0开始的,这一点需要注意。

1
enum digits {zero, one = 0, two, three = 1};

这里,zeroone的枚举量都为0,twothree都是1

除了可以将int类型的值赋值给枚举量,还可以使用longlong long类型的值。

枚举的取值范围

现在有指定了枚举量的枚举如下所示:

1
2
3
enum bits(one = 1, two = 2,four = 4,eight = 8};
bits myflag;
myflag = bits(6);

问:

上述赋值是否合法
答案

合法,虽然6不是枚举量,但它位于枚举定义的取值范围内。

关于取值范围的定义(参考C++ primer 第六版):

1
enum bigstep(firat,second = 100, third};

首先,要找出上限,需要知道枚举量的最大值。找到大于这个最大值的、最小的2的幂,将它减去1,得到的便是取值范围的上限。例如,定义的bigstep的最大值枚举值是101。在2的幂中,比这个数大的最小值为128,因此取值范围的上限为127。要计算下限,需要知道枚举量的最小值。如果它不小于0,则取值范围的下限为0∶否则,采用与寻找上限方式相同的方式,但加上负号。


例如,如果最小的枚举量为-6,而比它小的、最大的2的幂是-8(加上负号),因此下限为-7。选择用多少空间来存储枚举由编译器决定。对于取值范围较小的枚举,使用一个字节或更少的空间∶而对于包含 long类型值的枚举,则使用4个字节。

应用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include "main.h"
using namespace std;
enum myFlag {
one,
two = 0,
three,
four = 1
};
int main()
{
cout << three << endl;
myFlag flag = myFlag(0);
cout << flag << endl;
system("pause");
return 0;
}

输出结果:

1
0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdlib.h>
int main()
{

enum color { red=1, green, blue };

enum color favorite_color;

/* 用户输入数字来选择颜色 */
printf("请输入你喜欢的颜色: (1. red, 2. green, 3. blue): ");
scanf("%u", &favorite_color);

/* 输出结果 */
switch (favorite_color)
{
case red:
printf("你喜欢的颜色是红色");
break;
case green:
printf("你喜欢的颜色是绿色");
break;
case blue:
printf("你喜欢的颜色是蓝色");
break;
default:
printf("你没有选择你喜欢的颜色");
}

return 0;
}
请输入你喜欢的颜色: (1. red, 2. green, 3. blue): 1
你喜欢的颜色是红色