有時候,你會想要定義一組相關的常數,例如,以一組常數來代表遊戲中動作:
#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;
}