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

402, 2022-02-02

目次

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

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

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

関連記事

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文などと合わせて非常によく使われる機能です。
覚えておくとプログラミングがはかどります。

(^ _ ^)

定数はすばらしい

(・ v ・)

不変の値



この記事のアンケートを送信する