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
2
3
4
5
6
7
8
9
enum cats {
juran = 3,
guoran,
dala,
baomei,
baodi,
zhaofeng,
ainiao
};

结果如下:

1
2
3
4
juran = 3
guoran = 4
dala = 5
ainiao = 9

值表中途赋值

1
2
3
4
5
6
7
8
9
enum cats {
juran,
guoran,
dala = 0,
baomei,
baodi,
zhaofeng,
ainiao
};

给出如下:

1
2
3
4
juran = 0
guoran = 1
dala = 0
ainiao = 4

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
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

enum DAY{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

int main(){
// 遍历枚举元素
for (day = MON; day <= SUN; day++) {
printf("枚举元素:%d \n", day);
}
}

错误示范

以下错误示范给出的提示均由 Linux的 GNU 编译器 及 Mac的 ClangApple clang version 11.0.0 (clang-1100.0.33.17))编译器给出。

重复定义

不允许 在同一个作用域内 定义 一样的枚举名称 ;也不允许 在同一个作用域内 的不同枚举变量中定义 名称一样的元素

image-20210523204125878
image-20210523204041715

以上两种情况的错误提示如下:

image-20210523182310296
image-20210523204224839

也就是说 枚举名称和枚举元素都要绝对唯一

数值更改

枚举类数据不允许更改数值(包括自增和赋值都不允许),有点类似于常量(const)。

枚举中的元素自增时的错误提示:

image-20210523202049638

枚举中的元素赋值时的错误提示:

image-20210523202501260

根据 网友的回答 :

C支持枚举类型的自增操作,但C++不支持。

以下为常量自增时给出的错误提示:

image-20210523202757582