概述
文章目录
- 枚举
- 声明与使用
- 设置枚举的值
- 枚举的取值范围
- 应用实例
- 枚举进阶
- 1. 位运算支持
- 2. 0值
- 3. 用枚举代替`define`
枚举
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
,其他以此类推。
声明与使用
color cor1; //定义了一个类型为color的变量cor1
//枚举变量的赋值
cor1 = red; //正常赋值
cor1 = 20; //非法,20不是枚举变量
由此可以看出,枚举变量的赋值受到限制,与程序员的定义有关。
-
对枚举而言,它的操作符只有赋值运算符
=
,这就意味着枚举变量不能执行++、--、+、—
等等号
以外的操作。 -
枚举量是整形,可被提升为int类型,但int类型不能自动转换为枚举类型
-
枚举可以进行强制类型转换,但不确定其结果,如
cor1 = spectrum(100);
-
如果只打算使用常量,而不创建枚举类型的变量,则可以省略枚举类型的名称
enum {red,orange}
;
设置枚举的值
可以使用赋值运算符显式地来设置枚举量的值:
enum bits {one = 1, two = 2, three = 3};
但是,指定的值必须是整数。也可以只显式的设置其中一部分的值,默认情况下,枚举的 第一个常量始终是从0
开始的,这一点需要注意。
enum digits {zero, one = 0, two, three = 1};
这里,zero
和one
的枚举量都为0
,two
和three
都是1
。
除了可以将int
类型的值赋值给枚举量,还可以使用long
和long long
类型的值。
枚举的取值范围
现在有指定了枚举量的枚举如下所示:
enum bits(one = 1, two = 2,four = 4,eight = 8};
bits myflag;
myflag = bits(6);
问:
合法,虽然`6`不是枚举量,但它位于枚举定义的取值范围内。
关于取值范围的定义(参考C++ primer 第六版):
enum bigstep(firat,second = 100, third};
首先,要找出上限,需要知道枚举量的最大值。找到大于这个最大值的、最小的2的幂,将它减去1,得到的便是取值范围的上限。例如,定义的bigstep的最大值枚举值是101。在2的幂中,比这个数大的最小值为128,因此取值范围的上限为127。要计算下限,需要知道枚举量的最小值。如果它不小于0,则取值范围的下限为0∶否则,采用与寻找上限方式相同的方式,但加上负号。
例如,如果最小的枚举量为-6,而比它小的、最大的2的幂是-8(加上负号),因此下限为-7。选择用多少空间来存储枚举由编译器决定。对于取值范围较小的枚举,使用一个字节或更少的空间∶而对于包含 long类型值的枚举,则使用4个字节。
应用实例
#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;
}
输出结果:
0
#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. 位运算支持
在使用枚举时结合到 2进制 的强大,对枚举值自由的进行异或运算。
举例一:
enum AttributeTargets
{
Assembly = 0x0001,
Class = 0x0002,
Struct = 0x0004
...
};
举例二:
但是在
enum FileAccess
{
Read = 0x1,
Write = 0x2,
ReadWrite = Read | Write
};
2. 0值
为简单枚举提供一个 0 值枚举量,可以考虑将其命名为 None
。如果这个名对于特定的枚举不合适的时候,可以自行找一个准确的。
enum Compression
{
None = 0,
GZip,
Deflate
};
3. 用枚举代替define
在合适的情况下尽量使用枚举类型,而不是静态常量或 “#define” 值 。枚举 类型是一个具有一个静态常量集合的结构体。如果遵守这些规范,定义枚举类型,而不是带 有静态常量的结构体,您便会得到额外的编译器和反射支持,在调试代码时也能更加直观。
Good:
enum Color
{
Red,
Green,
Blue
};
bad:
const int RED = 0;
const int GREEN = 1;
const int BLUE = 2;
#define RED 0
#define GREEN 1
#define BLUE 2
最后
以上就是爱笑咖啡为你收集整理的【C/C++】enum 枚举枚举枚举进阶的全部内容,希望文章能够帮你解决【C/C++】enum 枚举枚举枚举进阶所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复