说句闲话:C++ 的 enum 是个啥?

本文简单介绍 C++ 中 enum 关键字在 OI 中的用处,范围为 C++14,编译器为 GCC。

拜谢语法大神 @zengqhuai 的科普。

高级的 define

POV:你在做数据结构题,主函数 for 循环内的代码可能是这样的:

for(int i=1;i<=q;i++){
  int op;cin>>op;
  if(op==1)     // 单点加  
  else if(op==2)// 区间加  
  else if(op==3)// 单点查值
  else if(op==4)// 区间求和
  else if(op==5)// 区间取 min
  else if(op==6)// 区间取 max
}

在 OI 题目中,给不同的操作种类一个特定的数字来让输入便于处理是常见的。当然,也有给不同操作相同数字的神金题目,看这里

当然,不只有输入时需要用数字区分操作种类,有时候我们写了一个集成了部分相似功能的函数,需要通过判断操作转到不同的片段执行。又或者我们在做一个 DP,各种状态的转移通过加减数实现,不同的转移操作对应不同的数。此时如果我们能用操作名代替单纯的数,可以很好的提升我们的代码清晰度。

于是有 enum 的第一个功能:批量 define。

enum 的用法类似一个结构体:

enum{ ADDP,ADDS,QP,QS,QMAX,QMIN }; // 注意 QMIN 后面不用加 ;  

上述代码在 OI 能用到的作用中等价于:

#define ADDP 0
#define ADDS 1
#define QP 2
#define QS 3
#define QMAX 4
#define QMIN 5

也可以是:

const int ADDP=0,ADDS=1,QP=2,QS=3,QMAX=4,QMIN=5;

但是我们想让 ADDP 从 1 开始枚举,此时只需要:

enum{ ADDP=1,ADDS,QP,QS,QMAX,QMIN };  
//    1      2    3  4  5    6

于是上文的 for 循环可以改写为:

enum{ ADDP=1,ADDS,QP,QS,QMAX,QMIN };
int main(){

  ...
  for(int i=1;i<=q;i++){
    int op;cin>>op;
    if(op==ADDP)     // 单点加  
    else if(op==ADDS)// 区间加  
    else if(op==QP)// 单点查值
    else if(op==QS)// 区间求和
    else if(op==QMAX)// 区间取 min
    else if(op==QMIN)// 区间取 max
  }
}

枚举中的每一个量都是一个 const int,不可以给它在 enum 外赋值,也不可以给它一个浮点数。

// this got CE
enum {
	ADD=0.1,MULT,SUB,DIV,QV,QMAX,QMIN
};
cout<<ADD;

// also this
enum {
	ADD=1,MULT,SUB,DIV,QV,QMAX,QMIN
};
ADD=733;

分段枚举

我们可能想让某些元素在一段中枚举,一些在另一段中枚举,此时可以给枚举元素赋不同的初值:

enum{A=1,B,C=6,D,E};
//   1   2 6   7 8
enum{ A=-3,B, C=-7,D, E};
//   -3   -2 -7   -6 -5

奇怪的 struct

enum 也有类似结构体的功能。

你可以给你的 enum 一个类型名字:

enum E{a,b,c,d,e};

你当然可以用这个类型定义一个枚举变量:

enum E{a,b,c,d,e}test;  

E test; // or this

这个 test 相当于一个 int,可以且仅可以被自己枚举类型里面的元素赋值。

// this is ok
enum E{
	ADD=1,MULT,SUB,DIV,QV,QMAX,QMIN
};
E a;
a=MULT;// a=2

// this will got CE
enum E{
	ADD=1,MULT,SUB,DIV,QV,QMAX,QMIN
};
E a;
a=1;

如果你要给这个变量输入一个值,仅有 scanf() 能做到,且此时该变量可以被输入正常 int 能接受的所有值。

// this is ok
enum E{
		ADD=1,MULT,SUB,DIV,QV,QMAX,QMIN
};
E a;
scanf("%d",a);

// this will got CE
enum E{
		ADD=1,MULT,SUB,DIV,QV,QMAX,QMIN
};
E a;
cin>>a;

你说它有什么用呢?我没看出来有什么用。

用处就这些了喵。

posted @ 2025-04-24 23:19  hm2ns  阅读(12)  评论(0)    收藏  举报