列舉


有時候,你會想要定義一組相關的常數,例如,以一組常數來代表遊戲中動作:

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