EasyC++,枚举值的使用

开发 后端
由于color是一个枚举类型,所以当我们赋值的时候,只能赋值列举出来的类型,如果附上其他的值可能会出问题。根据编译器的不同出现的结果也不一样,有些编译器会报错,有些则只会给出警告。

[[431274]]

大家好,我是梁唐。

这是EasyC++系列的第14篇,咱们来聊聊C++当中的枚举值。

想要追求更好阅读体验的同学,可以点击文末的「阅读原文」,访问github仓库。

枚举

简介

C++当中提供了枚举操作,我们可以使用enum关键字创建枚举类型。

这种方式创建的为符号常量,可以代替const关键字,并且还可以自定义名字,让代码可读性更强。如:

  1. enum color {red, blue, orange, white, black}; 

在这一句语句当中完成两件事,首先我们创建了一个新的变量类型叫做color,这是一个枚举类型。其次我们创建了一些符号常量,例如red,bule,orange这些。在默认状态下,会将这些枚举量赋值为整数,第一个枚举量red为0,第二个blue为1,以此类推。

当然我们也可以显示地给这些枚举量赋值,如:

  1. enum color {red=3, blue=1, orange, white, black}; 

这样前面给定了数值的red和blue会按照我们给定的值进行赋值,而之后从orange开始,依次赋值成2,3,4.

使用

我们定义了枚举类型之后,可以当做正常类型来进行声明:

  1. color a; 

由于color是一个枚举类型,所以当我们赋值的时候,只能赋值列举出来的类型,如果附上其他的值可能会出问题。根据编译器的不同出现的结果也不一样,有些编译器会报错,有些则只会给出警告。不管是报错还是警告,我们都不应该这么做:

  1. color a = red; // OK 
  2. color a = 10; // 报错或警告 

由于enum底层存储的是整型,所以有一些奇怪的操作是允许的,但是也强烈不建议这么做,也可能会有很大的风险。比如:

  1. cout << red < blue << endl; // 比较大小 
  2. cout << blue - red << endl; // 做加减法 
  3.  
  4. int c = red + 3; // 赋值给int 

这些操作在语法上都是允许的,但非常不推荐这么干,因为没有意义。枚举型当中每一个类型都有各自的逻辑含义,是不能拿来做计算的。虽然语法上可行,但逻辑上没有意义。

我们也可以使用强制转换将整型转成枚举类型:

  1. color c = color(3); 

但同样不推荐,因为有可能数字3对应的枚举量并不存在,这也不会报错,但也许会影响程序的正确性。

枚举值的取值范围

前文说了,只有声明中的枚举值是有效的,然而由于C++允许使用强制转换转换成枚举值,所以理论上枚举值取值范围内的值都可以被转换成枚举值,虽然这些值在逻辑上不一定有意义。

对于枚举变量来说,它的范围并不是固定的,而是根据定义情况波动的。C++会根据枚举值声明的情况计算上限和下限,只能允许在范围内的整型值强制转化为枚举值。

  1. enum flag {black = 1, white = 2, red = 23}; 

C++采取的是最小长度的方式,比如说我们上面定义的枚举值最大的是23,它会计算出大于23的最小2的幂,也就是32。所以这个枚举值的上限就是31,对于下限也会采用类似的计算,如果定义的最小值大于等于0,那么它的下限就是0,否则采取同样的算法,只不过加上负号。

 

之所以会如此复杂,也是为了尽可能地节省内存空间。毕竟很多C++程序的运行环境都是单片机或者是芯片,内存并不充裕。

 

责任编辑:武晓燕 来源: Coder梁
相关推荐

2021-12-12 18:13:54

C++This指针

2021-12-29 20:31:40

C++多态指针

2021-12-08 10:43:09

C++实现

2021-11-26 00:03:20

C++编译常量

2021-12-09 10:56:50

函数C++原型

2021-12-30 14:58:58

C++函数动态

2021-12-10 10:45:36

C++函数Stock

2021-10-26 00:19:51

C++结构体存储

2021-11-27 11:50:09

C++静态持续

2021-11-09 10:38:16

C++Const指针

2021-12-11 19:02:03

函数C++对象

2021-10-21 18:52:00

C++数组存储

2021-10-31 20:24:24

C++for循环

2021-11-10 10:48:36

C++函数指针

2022-01-04 16:35:42

C++Protected关键字

2021-12-05 18:20:42

C++空间特性

2021-12-15 10:25:57

C++运算符重载

2021-10-27 16:27:20

C++指针操控

2021-11-26 10:56:28

C++存储持续性

2021-12-26 00:08:35

C++初始化列表
点赞
收藏

51CTO技术栈公众号