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
};
↑の場合、A
は0
から始まります。そしてB
は1
になります。
C = 10
でC
に10
を代入します。
そうするとD
は11
, E
は12
になります。
定数の値を後から変更しようとしてみる
ちなみに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文などと合わせて非常によく使われる機能です。
覚えておくとプログラミングがはかどります。
🦝 < 定数はすばらしい
🐭 < 不変の値