enum in C/C++
enum
是 Enumeration // 的缩写,是C/C++中的
枚举 关键字。
特点
符合以下场景时可能需要使用到枚举:
- 需要使用到的变量 数量较大,通过枚举以简写代码,提高代码可读性
- 使用整形(integer)进行定义(但不同于直接定义成
int
的 显式整形,使用枚举类型定义的话会变成 隐式整形) - 所有值都是有固定范围的,是可人为预设的。
- 具有常量的特性(主要特点是:不可在定义之外的地方被修改)
注意:
- 在所有枚举值都未被赋值的情况下,枚举值默认从 0 开始,往后逐个加 1(递增)。
定义
枚举格式:一般为
enum 枚举名{ 枚举值表 };
,也可以省略枚举名,写成如下格式:
1 | enum typeName{ valueName1, valueName2, valueName3, ...... }; |
enum
定义 枚举类型的关键字;
typeName
是 枚举类型的名称,即 枚举名。
valueName1, valueName2, valueName3, ......
是每个值对应的名字的列表,所有元素集合即为 枚举值表注意:最后的
;
不能少。
使用示例
起始值赋值
1 | enum cats { |
结果如下:
1 | juran = 3 |
值表中途赋值
1 | enum cats { |
给出如下:
1 | juran = 0 |
Typedef enum
Typedef enum 的用法一般如:
1 | typedef enum{....} a; |
enum 的用法一般如:
1 | enum{....} a; |
前者是将 enum{….}
定义成一个
a类型,声明变量的时候可以用 a b
格式;可以理解为类似 int i
;
后者是将 enum{….}
声明了一个
变量a
。
枚举遍历
在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的。
不过在一些特殊的情况下,枚举类型必须连续是可以实现有条件的遍历。
1 |
|
错误示范
以下错误示范给出的提示均由 Linux的 GNU 编译器 及 Mac的 Clang(Apple clang version 11.0.0 (clang-1100.0.33.17))编译器给出。
重复定义
不允许 在同一个作用域内 定义 一样的枚举名称 ;也不允许 在同一个作用域内 的不同枚举变量中定义 名称一样的元素。
以上两种情况的错误提示如下:
也就是说 枚举名称和枚举元素都要绝对唯一。
数值更改
枚举类数据不允许更改数值(包括自增和赋值都不允许),有点类似于常量(const)。
枚举中的元素自增时的错误提示:
枚举中的元素赋值时的错误提示:
根据 网友的回答 :
C支持枚举类型的自增操作,但C++不支持。
以下为常量自增时给出的错误提示: