C言語のenumはあなたの仕事を3倍効率的にします
目次
- C言語のenumはあなたの仕事を3倍効率的にします
- enumによる定数の定義
- 定数の値を後から変更しようとしてみる
- enum変数を定義する
- typedefでenum型を作る
- enumとswitch文
- 定数の値を出力する
- 定数をintに保存する
- おわりに
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 };
↑の場合、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文などと合わせて非常によく使われる機能です。
覚えておくとプログラミングがはかどります。
(^ _ ^) | 定数はすばらしい |
(・ v ・) | 不変の値 |