【C言語】列挙型 enum の使い方と考え方|定数管理と switch 分岐を安全に書く
今回の記事でわかること
- if 文や switch 文での実践的な使い方が理解できる
- 列挙型(enum)の基本的な使い方が分かる
- 定数をひとまとめに管理する考え方が身につく
列挙型とは
列挙型(enum)はいくつかの決まった定数をひとつのグループとして扱うための型 です
曜日、状態、選択肢、メニュー番号など
「取りうる値が限られているもの」を表現するときに向いています
例えば、曜日を数値で扱う場合
int today = 3;だけを見ると「3 が何を意味しているのか」はコードから分かりません
enum を使うと、意味を名前で表現できます
#include <stdio.h>
enum Weekday {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
};
int main(void) {
enum Weekday today = WEDNESDAY;
printf("今日は %d 日目の曜日です\n", today);
return 0;
}このように、数値ではなく意味で状態を表現できる のが enum の最大の特徴です
列挙型の値の仕組み
enum の値は、何も指定しなければ 0 から順番に自動で割り当てられます
SUNDAY = 0
MONDAY = 1
TUESDAY = 2
WEDNESDAY = 3 必要であれば、自分で値を指定することもできます
SUNDAY = 0
MONDAY = 1
TUESDAY = 2
WEDNESDAY = 3 この場合は
SUNDAY = 1
MONDAY = 2
... というように連番になります
外部仕様やデータ形式と数値を合わせたいときに便利です
switch 文での使い方
enum は switch 文と非常に相性が良いです
#include <stdio.h>
enum Weekday {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
};
int main(void) {
enum Weekday today = FRIDAY;
switch (today) {
case MONDAY:
printf("月曜日です\n");
break;
case FRIDAY:
printf("金曜日です!\n");
break;
default:
printf("その他の曜日です\n");
}
return 0;
}case に意味のある名前を直接書ける ため
- 数字の対応表を覚えなくていい
- 間違った値を使いにくい
- 後から読んでも理解しやすい
というメリットがあります
if 文で使う場合
if 文でも同じように使えます
enum Status {
STATUS_OK,
STATUS_ERROR,
STATUS_TIMEOUT
};
enum Status result = STATUS_ERROR;
if (result == STATUS_ERROR) {
printf("エラーが発生しました\n");
}数値比較ではなく、状態そのものを比較している ことがはっきり分かります
列挙型を使うメリット
enum を使うことで、コードは次のように改善されます
- 定数を一か所でまとめて管理できる
- 数字の意味を覚えなくてよくなる
- switch や if が読みやすくなる
- 不正な値を使っていることに気づきやすい
特に 状態管理・分岐処理・選択肢がある処理 では効果が大きいです
const や #define との使い分け
- ただの固定値 → const
- 条件付き置換や簡易マクロ → #define
- 取りうる値が決まっている状態 → enum
このように考えると迷いにくくなります
enum は「数値そのもの」ではなく 意味を持った選択肢を表現するための道具 です
まとめ
列挙型(enum)は複数の定数を 意味のあるグループとして扱うための型 です
- 状態や選択肢を名前で表現できる
- switch や if の分岐が読みやすくなる
- マジックナンバーを減らせる
「数値で管理しているけど意味が分かりにくいな」と感じたら、enum を使うタイミングです。const や #define と組み合わせて使うことで、安全で読みやすい C 言語のコードが書けるようになります