列挙型


定数リストの定義

C言語の変数の型で、もうひとつ特殊な列挙型というものがあります
列挙型は定数のリストを定義することができます
列挙型を作成するにはenumキーワードを使用します

enum タグ名 {定数リスト} 変数;

タグ名には、この列挙型の名前を指定します
これは構造体と同様に、別の場所で変数を宣言する時に使用します
定数リストには、それぞれの定数名をカンマ「 , 」で区切って指定します
変数には、この列挙方の変数名を指定します

構造体や共用体をやってきた今となっては、enumの感覚もなんとなくわかるでしょう
例としては次のように定義します

enum TAG { ASAHINA , MIZUNO , HUZISAKI , KISARAGI } tokimemo;

これは列挙型変数tokimemoの定義例です
忘れてはいけないのが定数の本質は整数であるということです
列挙型のリストの定数は、一番左側を0として1ずつ増えていきます
つまり、ASAHINAは0を、MIZUNOは1を、HUZISAKIは2を、KISARAGIは3を表します
#include <stdio.h>

enum Kitty { MIMI , YUKI , RENA };

int main() {
        enum Kitty cats;

        cats = MIMI;
        printf("MIMI = %d\n" ,cats);
        cats = YUKI;
        printf("YUKI = %d\n" , cats);
        cats = RENA;
        printf("RENA = %d\n" ,  cats);

        return 0;
}
結果は次のようになりました

MIMI = 0
YUKI = 1
RENA = 2

このプログラムでは、Kittyという列挙型を定義しています
列挙型の変数をmain()関数内で宣言し、それぞれの定数の値を代入しています

定数の値は、デフォルトで左から1ずつ加算した値になりますが
代入式で直接値を指定することもできます

enum Kitty {MIMI , YUKI = 5 , RENA};

この場合、YUKIは5になりますが、デフォルトのカウンタも5にセットされます
つまり、YUKI移行は5からカウントされて値が代入されます
結果としてRENAは6になるということに注意してください
#include <stdio.h>

enum Kitty { MIMI , YUKI = 5 , RENA };

int main() {
        enum Kitty cats;

        cats = MIMI;
        printf("MIMI = %d\n" ,cats);
        cats = YUKI;
        printf("YUKI = %d\n" , cats);
        cats = RENA;
        printf("RENA = %d\n" ,  cats);

        return 0;
}
結果は次のようになります

MIMI = 0
YUKI = 5
RENA = 6

定数を使ったプログラムでは、switch制御文を使用すると大変便利です
関数の呼び出し時に定数を受け取り、その定数にしたがって処理するような場合に使えます
そういえば、サンプルソースの中でswitchを使うのってひさしぶりですね♪
#include <stdio.h>

enum Kitty { MIMI , YUKI = 5 , RENA } cats;

int main() {
        cats = RENA;

        switch(cats) {
        case MIMI:
                printf("ミミが好き");
                break;
        case YUKI:
                printf("ユキが好き");
                break;
        case RENA:
                printf("レナが好き");
        }

        return 0;
}
列挙型はその仕様すら曖昧なものなので、多くの疑問が残るものです
たとえば、次の場合を考えてください

enum TAG { AKARI } hiro;
hiro = 10;
int i = AKARI;

列挙型に通常の数値型を代入したり
int型の変数にenumで定義した定数を代入しています

一見エラーが発生しそうですが、それは仕様上で定義されておらずコンパイラ依存になります
列挙型の局所性はコンパイラによって様々です
列挙型の定数値が他の型の変数に代入できるかどうかなど、ご自分の環境で試してください

enumはの定数は #define と同質の定数です
つまり、enumの定数値はメモリに保存されません(コンパイル時に展開)


enum [tag] {enum-list} [declarator]

列挙型の定義をします

tag - タグ名を指定します。省略可能です
enum-list - 定数リストを作成します
declarator - 列挙型変数名を指定します。省略可能です



前のページへ戻る次のページへ