ユーニックス総合研究所

  • home
  • archives
  • c-enum

C言語のenumはあなたの仕事を3倍効率的にします

  • 作成日: 2022-02-02
  • 更新日: 2023-12-25
  • カテゴリ: C言語

C言語のenumはあなたの仕事を3倍効率的にします

C言語には「列挙型(enum)」という機能があります。
これは定数を効率よく定義するための機能です。
C言語のenumを使うと普段の仕事を3倍効率的にすることもできます

この記事ではC言語のenumについて具体的に解説します。

関連記事

目が覚めるC言語のdo-while文の使い方【ループ処理、初心者向け】
明快!C言語のcontinue文の使い方
君はまだC言語のdefineのすべてを知らない【マクロ、プリプロセス】
プログラミングのポインタをわかりやすく解説【C言語】
コードで見るC言語とC++の7つの違い

enumによる定数の定義

最初にenumによる定数の定義方法を見てみます。
enumで定数を定義するには↓のようにコードを書きます。

enum タグ名 {  
    定数,  
    定数,  
    ...  
};  

この内、「タグ名」は省略することができます。

enum {  
    定数,  
    定数,  
    ...  
};  

定数」の部分では定数を定義します。
たとえば「ZERO」や「ONE」といった定数を定義したい場合は↓のようにします。

enum {  
    ZERO,  
    ONE,  
};  

enumでは定数を定義するときに、↑のように定数の値を省略することができます
定数の値を省略した場合は上から順に0, 1, 2, 3, ...と言う風に値が振られていきます。

enum {  
    ZERO,  // <- 値は0  
    ONE,  // <- 値は1  
    TWO,  // <- 値は2  
};  

このように定数の値を省略すると自動で値が割り当てされるのでenumによる定数の定義は非常に楽です。

定数の値を手動で割り当てたい場合は↓のように代入式を書きます。

enum {  
    HELLO = 123,  
    WORLD = 456,  
};  

↑の場合、HELLOには123が、WORLDには456が割り当てされます。

代入式を書いた場合、それ以降の自動に割り当てられる値は、その代入式の値から増えていきます。

enum {  
    A,       // <- 値は0  
    B,       // <- 値は1  
    C = 10,  // <- 値は10  
    D,       // <- 値は11  
    E,       // <- 値は12  
};  

↑の場合、A0から始まります。そしてB1になります。
C = 10C10を代入します。
そうするとD11, E12になります。

定数の値を後から変更しようとしてみる

ちなみにenumの定数は定数なので、あとから値を変更することはできません
コンパイルエラーになります。

enum {  
    RICE = 123,  
};  

int main(void) {  
    RICE = 456;  // error!  
    return 0;  
}  

enum変数を定義する

enumをタグ名付きで定義すると、そのタグ名を使って変数を作ることができます。

#include <stdio.h>  

enum Food {  
    RICE,  
    BREAD = 10,  
    MEAT,  
};  

int main(void) {  
    enum Food rice = RICE;  
    enum Food bread = BREAD;  
    enum Food meat = MEAT;  

    printf("rice: %d\n", rice);  // rice: 0  
    printf("bread: %d\n", bread);  // bread: 10  
    printf("meat: %d\n", meat);  // meat: 11  

    printf("sizeof enum Food: %ld\n", sizeof(enum Food));  
    // sizeof enum Food: 4  

    return 0;  
}  

↑のようにenum Food rice = RICE;と書くと、Food型の変数riceを定義できます。
ちなみにenum型の変数は筆者の環境では4バイトになります。

typedefでenum型を作る

typedefを使うとenum型を作ることができます。

typedef enum {  
    定数,  
    定数,  
    ...  
} 型名;  

実際のコードは↓のように書きます。

#include <stdio.h>  

typedef enum {  
    RICE,  
    BREAD,  
    MEAT,  
} Food;  

int main(void) {  
    Food my_food;  

    my_food = MEAT;  

    printf("%d\n", my_food);  // 2  

    return 0;  
}  

↑の場合、Foodというのがtypedefしている型名です。
typedefするとFood my_food;のように変数を定義できます。
タグ名による定義と比べるとenumが取れてシンプルになっていますね。

enumとswitch文

enumの友達と言えるのが「switch文」です。
enumの定数は整数と同じなため、switch文で使うことができます。

#include <stdio.h>  

enum Food {  
    RICE,  
    BREAD,  
    MEAT,  
};  

int main(void) {  
    enum Food food = BREAD;  

    switch (food) {  
    case RICE: puts("ごはんです。"); break;  
    case BREAD: puts("パンです。"); break;  
    case MEAT: puts("お肉です。"); break;  
    }  

    return 0;  
}  

↑のコードをコンパイルして実行すると↓の結果になります。

パンです。  

enumとswitch文は非常によく使う組み合わせです。
switch文のためにenumがあると言っても良いです。

定数の値を出力する

enumの定数は整数と同じです。
そのためprintf()で出力したい場合は書式に%dを使います。

#include <stdio.h>  

enum {  
    RICE = 123,  
};  

int main(void) {  
    printf("%d\n", RICE);  // 123  
    return 0;  
}  

定数をintに保存する

enumの定数は整数なのでint型の変数に代入することもできます

#include <stdio.h>  

enum {  
    RICE = 123,  
};  

int main(void) {  
    int n = RICE;  

    printf("%d\n", n);  // 123  

    return 0;  
}  

GCCなどのコンパイラでは警告もエラーも出力されません。

おわりに

今回はC言語の列挙型(enum)について解説しました。
enumはswitch文などと合わせて非常によく使われる機能です。
覚えておくとプログラミングがはかどります。

🦝 < 定数はすばらしい

🐭 < 不変の値