月ノ書

【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 を使うことで、コードは次のように改善されます

特に 状態管理・分岐処理・選択肢がある処理 では効果が大きいです

const や #define との使い分け

このように考えると迷いにくくなります
enum は「数値そのもの」ではなく 意味を持った選択肢を表現するための道具 です

まとめ

列挙型(enum)は複数の定数を 意味のあるグループとして扱うための型 です

「数値で管理しているけど意味が分かりにくいな」と感じたら、enum を使うタイミングです。const や #define と組み合わせて使うことで、安全で読みやすい C 言語のコードが書けるようになります

学習進捗

0
Would love your thoughts, please comment.x