列挙型
概要
列挙型を使用すると整数に名前をつけることができます。
これによって、ただの値が意味を持つことになるのでソースの可読性が向上します。
また、列挙型は列挙定数の値が1ずつ増えるという特性がありますので、
連続した値を用意したい場合に使用します。
書式
書式例
enum 列挙型名 {
列挙定数1,
列挙定数2,
};
※列挙型名は指定しなくてもエラーにはなりません。
具体例
enum SEASON {
SPRING,
SUMMER,
AUTUMN,
WINTER,
};
性質
列挙定数の法則
列挙定数の基本は定数の先頭を0として1ずつ増えていきます。
上の具体例でいうとSPRINGが0、SUMMERは1、
AUTUMNは2、WINTERは3となります。
例
enum SEASON {
SPRING,
SUMMER,
AUTUMN,
WINTER,
};
int main(void)
{
printf("SPRING = %d\n", SPRING);
printf("SUMMER = %d\n", SUMMER);
printf("AUTUMN = %d\n", AUTUMN);
printf("WINTER = %d\n", WINTER);
return 0;
}
実行結果:
SPRING = 0
SUMMER = 1
AUTUMN = 2
WINTER = 3
列挙定数の初期化
任意の値を設定するとその値から1ずつ増えていきます。
初期化例
enum SEASON {
SPRING = 10,
SUMMER,
AUTUMN = 20,
WINTER,
};
上の例ではSPRINGには10を、AUTUMNには20を代入しています。
この場合、SUMMERは11、WINTERは21として扱われます。
使用例
enum SEASON {
SPRING = 10,
SUMMER,
AUTUMN = 20,
WINTER,
};
int main(void)
{
printf("SPRING = %d\n", SPRING);
printf("SUMMER = %d\n", SUMMER);
printf("AUTUMN = %d\n", AUTUMN);
printf("WINTER = %d\n", WINTER);
return 0;
}
実行結果:
SPRING = 10
SUMMER = 11
AUTUMN = 20
WINTER = 21
利便性
プログラムでは連続したID1つ1つが特別な情報を持っていることが多々あります。
このようなケースではconstやdefineではなく、enumを使用した方が利便性が高まります。
例
RPGのゲームの職業
勇者 => 0
戦士 => 1
魔法使い => 2
僧侶 => 3
職業最大数 => 4
上の例をdefineやconstで定義することも当然可能です。
const定義の例
const int Brave = 0;
const int Warrior = 1;
const int Wizard = 2;
const int Priest = 3;
const int MaxJob = 4;
上の例で特に問題なく、各職業を定数にすることができました。
ですが、仕様が変更して戦士と魔法使いの間に格闘家を追加することになった場合、
constやdefineの場合はWizard以降の数値をすべて変更する必要が出ます。
修正後のconst定義
const int Brave = 0;
const int Warrior = 1;
const int Fighter = 2;
const int Wizard = 3; // 2 => 3
const int Priest = 4; // 3 => 4
const int MaxJob = 5; // 4 => 5
今回は変更IDが3つなのでそこまで手間ではありませんが、これが10や20になると
ヒューマンエラーが発生する可能性が高くなるほど、手間がかかります。
このような手間を省くためにenumを使用します。
enumの場合、修正前と修正後は以下のようになります。
修正前
enum JOB
{
BRAVE = 0,
WARRIOR,
WIZARD,
PRIEST,
MAX_JOB,
};
・修正後
enum JOB
{
BRAVE = 0,
WARRIOR,
FIGHTER,
WIZARD,
PRIEST,
MAX_JOB,
};
enumの場合、IDの修正が必要ないので1文足すだけで修正は完了します。
このようにenumを使用すると利便性が高まることありますので、
定数を定義する際は特定のグループで連続した番号か
どうかを判断して使用のするかどうかを見極めてください。