【C/C++】enum 枚举

枚举

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

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

除了可以将int类型的值赋值给枚举量,还可以使用longlong 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;
}

输出结果:

1
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. red, 2. green, 3. blue): 1
你喜欢的颜色是红色

枚举进阶

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
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧恩意

如有帮助,感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值