有时候,你会想要定义一组相关的常数,例如,以一组常数来代表游戏中动作:
#include <stdio.h>
const int Action_STOP = 0;
const int Action_RIGHT = 1;
const int Action_LEFT = 2;
const int Action_UP = 3;
const int Action_DOWN = 4;
void play(int action) {
switch(action) {
case 0:
puts("播放停止动画");
break;
case 1:
puts("播放向右动画");
break;
case 2:
puts("播放向左动画");
break;
case 3:
puts("播放向上动画");
break;
case 4:
puts("播放向下动画");
break;
default:
puts("不支持此动作");
}
}
int main() {
play(Action_RIGHT);
play(Action_LEFT);
return 0;
}
这种方式虽然行得通,不过play
的参数定义为int
,在阅读上没有指出它可以接受的枚举,因而函数中的case
也不知道其意涵为何;对于这类枚举常数的需求,C 本身提供了enum
来达到这类任务。例如:
#include <stdio.h>
enum Action {
STOP, RIGHT, LEFT, UP, DOWN
};
void play(enum Action action) {
switch(action) {
case STOP:
puts("播放停止动画");
break;
case RIGHT:
puts("播放向右动画");
break;
case LEFT:
puts("播放向左动画");
break;
case UP:
puts("播放向上动画");
break;
case DOWN:
puts("播放向下动画");
break;
default:
puts("不支持此动作");
}
}
int main() {
play(RIGHT);
play(LEFT);
return 0;
}
enum Action
可以用来定义变量,被枚举的成员,见范围会与使用 enum 处的范围相同,如果有其他enum
枚举了同名的成员,会发生名称冲突。
enum
枚举的成员,会有默认的对应整数,无范畴的枚举成员,在必须获取整数值的场合,会自动转换为对应的整数,对应整数默认由 0 开始,也可以自行指定。例如:
enum Action {
STOP = 1, RIGHT, LEFT, UP, DOWN
};
就上例来说,STOP
对应的整数为后续枚举成员没有设定对应数值的话,会自动递增 1,所以RIGHT
为 2、LEFT
为 3,依此类推,然而枚举成员对应的常数值,不一定要有递增关系,例如:
#include <stdio.h>
int main() {
enum Action {
STOP = 2, RIGHT = 1, LEFT = 3, UP, DOWN
};
printf("STOP:%d\n", STOP);
printf("RIGHT:%d\n", RIGHT);
printf("LEFT:%d\n", LEFT);
printf("UP:%d\n", UP);
printf("DOWN:%d\n", DOWN);
return 0;
}
执行结果如下:
STOP:2
RIGHT:1
LEFT:3
UP:4
DOWN:5
在必要的时候,枚举元的数值可用来与其他数值作运算,例如:
#include <stdio.h>
int main() {
enum Action {
STOP, RIGHT, LEFT, UP, DOWN
};
printf("%d\n", LEFT + 1); // 显示 3
return 0;
}