在我最忠实的博客观众的提醒下,我决定写(shui)篇博客总结下 enum 枚举类型。

定义格式 链接到标题

enum <类型名> {<枚举常量表>};

e.g:

enum ClassMate {CLASSMATE_DONG, CLASSMATE_CAI, CLASSMATE_SUN, CLASSMATE_JIANG};

一些规范 链接到标题

枚举类型的名称用大驼峰格式

枚举类型内的枚举常量用全大写 + 下划线分割格式

枚举常量不能是字符常量或是整型常量,只能是一些标识符

声明格式 链接到标题

<类型名> <变量名>;

e.g:

ClassMate A;

枚举量 链接到标题

可以简单的将枚举类的枚举常量理解为一些整型数据的别名。

默认情况下编译器会设置第一个枚举常量的枚举量为 0,下一个为 1,以此类推。

当然我们也可以手动设置它们对应的枚举量,

e.g 1:

enum ClassMate {CLASSMATE_DONG = 1, CLASSMATE_CAI = 2, CLASSMATE_SUN = 4, CLASSMATE_JIANG = 5};

此时它们分别对应 1、2、4、5

e.g 2:

enum ClassMate {CLASSMATE_DONG = 4, CLASSMATE_CAI, CLASSMATE_SUN, CLASSMATE_JIANG};

此时它们分别对应 4、5、6、7

e.g 3:

enum ClassMate {CLASSMATE_DONG, CLASSMATE_CAI, CLASSMATE_SUN = 4, CLASSMATE_JIANG};

此时它们分别对应 0、1、4、5

总结 链接到标题

在完全手动设置枚举量的情况下枚举常量和枚举量就是我们设置的一一对应关系(虽然并不要求一定满足单射,但多个枚举常量对应同一个枚举量显然会给下面的应用带来影响,所以推荐满足双射)。

如果只给第一个枚举常量设置枚举量的话,编译器就会自动给后面的枚举常量设置一个递增的枚举量。

如果只给非第一个枚举常量设置枚举量的话,编译器就会给被设常量前的枚举常量设置从 0 开始递增的枚举量,给被设常量和它后面的枚举常量设置从被设值开始并递增的枚举量。

显然,枚举量只能是整数类型的,手动设置也是推荐设置一个升序的序列。

使用 链接到标题

输入 链接到标题

枚举变量无法直接输入,形如cin >> A;的语句是非法的。

输出 链接到标题

枚举变量可以直接输出。

e.g

cout << A;

赋值 链接到标题

枚举常量可以赋值给一个枚举变量,但枚举量不能直接赋值给一个枚举变量。

枚举变量可以赋值给另一个同类型的枚举变量,但不同类型的不可以。

也可以将枚举变量或枚举常量赋值给一个整型变量。

e.g

enum ClassMate {CLASSMATE_DONG, CLASSMATE_CAI, CLASSMATE_SUN, CLASSMATE_JIANG};
enum Class {CLASS_A, CLASS_B};
ClassMate A, B;
Class C, D;
A = CLASSMATE_CAI; //legal
A = 1;             //illegal
B = A;             //legal
C = A;             //illegal
int j = A;         //legal
int j = CLASS_A;   //legal

需要注意的是枚举变量是不需要也不能用引号包起来的

关系运算 链接到标题

枚举变量是可以进行形如 =、!=、>、<、>=、<= 这样的关系运算的,且其右侧可以为枚举量(整型量)。

e.g

enum Class {CLASS_A, CLASS_B};
Class A = CLASS_A;
if(A < CLASS_B); //legal
if(A > 1);       //legal

枚举变量的输入输出一般都采用 switch 语句将其转换为字符或字符串

枚举类型数据的其他处理也往往应用 switch 语句,以保证程序的合法性和可读性