枚举


有时候,你会想要定义一组相关的常数,例如,以一组常数来代表游戏中动作:

#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; 
}




展开阅读全文