列挙体

#include<stdio.h>
#define putsa(str) (putchar('\a'),puts(str))

enum animal {Dog,Cat,Monkey,Invalid};

void dog(void){
        puts("わんわん");
}
void cat(void){
        puts("にゃんにゃん");
}
void monkey(void){
        puts("きっきっ");
}

enum animal select(void){
        int tmp;

        do{
                printf("0… 犬 1… 猫 2… 猿 3… 終了:");
                scanf("%d",&tmp);
                if(tmp<Dog || tmp>Invalid){
                        putsa("不正な入力です。");
                }
        }while(tmp<Dog || tmp>Invalid);
        return tmp;
}

int main(void){
        enum animal selected;

        do{
                switch(selected = select()){
                        case Dog: dog(); break;
                        case Cat: cat(); break;
                        case Monkey: monkey(); break;
                }
        }while(selected != Invalid);

        return 0;
}
enum animal {Dog,Cat,Monkey,Invalid};

この部分は、列挙体の宣言。その列挙体に与える識別子であるanimalをタグと呼ぶ。

{}の中にかかれた、Dog,Cat,Monkey,Invalidは列挙定数で、それぞれの列挙定数には、先頭から順に0,1,2,3という整数値が与えられる。

enum animal型は、その値の集合を表す型になる。

enum animal selected;

この部分は、enum animal型をもつ変数selectedの宣言。

この宣言によって、selectedは,0,1,2,3という値をもち得る変数となる。