C++中的枚举

Enum(枚举)是一种创建符号常量的方式,可用于替代const。

  1. 定义:

默认情况下,enum定义的枚举量会成为符号常量,对应从0开始的整数,从左到右依次+1。
例如:

enum color{red, orange, yellow, green, blue, violet, black};
1
color是枚举名,是一种新类型,red、orange、yellow等是枚举量,都是符号常量,对应0~7的整数。

可以使用赋值运算符来设置枚举量的值,枚举量可以相等,左侧不一定大于右侧。而没有被设置的枚举量等于前一个枚举量+1。
例如:

    enum color{red = 1, orange, yellow=1 , green, blue, violet= 11, black};
    cout<< red <<endl 
        << orange <<endl
        << yellow <<endl
        << green <<endl
        << blue <<endl
        << violet <<endl
        << black <<endl;
    system("pause");

结果为

请按任意键继续. . .

在c++早期版本中,只能将int值赋给枚举量,但后来取消了该限制,可以使用long、long long类型的值赋值。

2、枚举变量:

枚举名+变量名,定义枚举变量。
例如:

color c;

color c为枚举变量,其取值为枚举量中的一个。

枚举变量不是int型,不能直接赋int值,可以使用枚举量赋值。
例如:

c = 3; //错误,不可以使用int赋值。
c = red; //正确
c = color(13); //正确,color(3)对int值进行了强制类型转换。
c = red + green; //错误,red和green相加会转换位int值。

这里单独说下第三种情况,如果强制类型转换的int值不在枚举范围内,结果是不确定的,这样做不会出错,但不能依赖得到的结果。下面的第三部分会说明枚举的取值范围。

枚举变量可以直接相互赋值。
例如:

color a;
color c;
c = a;

3、取值范围:

按照定义来说,枚举应该是在声明中具有的那些值才有效,但c++通过强制类型转换增加了其取值范围。
每个枚举都有其取值范围,在取值范围内的任意整数,无论是不是枚举量,都可以赋给枚举变量。
例如:

enum color{red = 1, orange, yellow=1 , green, blue, violet= 11, black};
color c;
c = color(13);  

由第一部分我们知道,枚举量中不包含13,而13实际是在取值范围内的,因此赋值是正确的。下面来看如何确定取值范围。

取值范围由枚举上下限确定,上限为大于最大枚举量的最小2的幂减1,下限分两种情况:如果枚举量都不小于0,则下限为0,否则同上限,不过要加个负号。
例如一个枚举的最大枚举量为98,最小枚举量为-5,则其上限为128-1=127,下限为-(8-1)=-7。

这个取值范围是在正确使用时才会保证有效的,下面来看一个特殊例子:

    enum color{red = 1, orange, yellow=1 , green, blue, violet= 11, black};
    color a;
    a = color(120);
    cout<< a <<endl;

结果如下:

120
请按任意键继续. . .

根据刚才的理论,color最大枚举量为12,,取值范围应该为[0,15]。120已经超出了范围,却没有报错。
原因在于,这里使用了强制类型转换,破坏了检测机制。编译器是不对强制转换带来的错误进行评估的,
因此没有报错。因此这种错误只能由程序员自己负责。

4、与const的区别:
1、enum可以定义新类型,而const是修饰符,无法定义新类型。比如上面的color a。
2、enum只能指定整型常量,而const可以指定任意类型常量。比如const double PI = 3.14159。
3、试图修改const定义的变量时,编译器会报错。而枚举变量的值是可以修改的。

C++ 中,枚举enum)是一种用户自定义类型,用于定义一组有限的命名常量。枚举类型可以让程序更加易读易懂,避免使用魔法数字,提高代码的可维护性。 枚举类型的定义格式为: ``` enum enum_name { enumerator1, enumerator2, ... }; ``` 其中,enum_name 是枚举类型的名称,enumerator1、enumerator2 等是枚举值(常量),它们用逗号分隔,最后一个枚举值后面没有逗号。 枚举值可以显式地指定一个整数值,也可以让编译器自动分配值。如果没有指定值,那么第一个枚举值默认为0,后面的枚举值依次递增1。如果指定了某个枚举值的值,那么后面的枚举值会在该值的基础上递增1。 枚举类型的变量可以像普通变量一样使用,并且只能取枚举类型中定义的值。例如: ``` enum Weekday { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; Weekday today = Thursday; if (today == Friday) { cout << "TGIF!" << endl; } else { cout << "It's not Friday yet." << endl; } ``` 上面的代码定义了一个 Weekday 枚举类型,包含七个枚举值。然后定义了一个 today 变量,它的值为 Thursday。在 if 语句中,使用 today == Friday 判断今天是不是周五。由于 today 的值为 Thursday,所以不满足条件,输出 It's not Friday yet.。 枚举类型可以作为函数参数或返回值,例如: ``` enum Color { Red, Green, Blue }; Color mix(Color c1, Color c2) { if (c1 == Red && c2 == Blue || c1 == Blue && c2 == Red) { return Purple; } else if (c1 == Red && c2 == Green || c1 == Green && c2 == Red) { return Yellow; } else if (c1 == Blue && c2 == Green || c1 == Green && c2 == Blue) { return Cyan; } else { return Black; } } ``` 上面的代码定义了一个 Color 枚举类型,包含三个枚举值。然后定义了一个 mix 函数,它接受两个 Color 类型的参数 c1 和 c2,返回一个新的 Color 类型的值。根据 c1 和 c2 的值不同,返回不同的颜色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值