實際開發中,某些變數的取值範圍固定且有限(如一週七天、十二個月)。使用 #define 雖可行,但會造成巨集名稱汙染、程式碼分散。C 語言提供枚舉類型,可集中列出所有可能值並賦予名稱。
enum 類型名 {
值名1, 值名2, 值名3, ...
};
enum 為關鍵字,專門用於定義枚舉。// 預設從 0 開始
enum week { Mon, Tues, Wed, Thurs, Fri, Sat, Sun }; // 0~6
// 全部手動指定
enum week { Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };
// 僅指定首個值,其餘遞增
enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun }; // 1~7
enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
enum week a = Mon, b = Wed, c = Sat; // 宣告並初始化
// 或合併寫法
enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;
#include <stdio.h>
int main() {
enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;
scanf("%d", &day);
switch (day) {
case Mon: puts("Monday"); break;
case Tues: puts("Tuesday"); break;
case Wed: puts("Wednesday"); break;
case Thurs: puts("Thursday"); break;
case Fri: puts("Friday"); break;
case Sat: puts("Saturday"); break;
case Sun: puts("Sunday"); break;
default: puts("Error!");
}
return 0;
}
case 後需為整數常量表達式的要求。巨集在預處理階段字串替換,枚舉在編譯階段常量替換。可視為「編譯期的巨集」,具備型別檢查、作用域限制等優勢。
#include <stdio.h>
int main() {
enum week { Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day = Mon;
printf("%d, %d, %d, %d, %d\n",
sizeof(enum week), sizeof(day), sizeof(Mon), sizeof(Wed), sizeof(int));
// 輸出:4, 4, 4, 4, 4 → 通常與 int 相同
return 0;
}