プロが教える店舗&オフィスのセキュリティ対策術

下記、勉強中の本から抜粋したものです。
main関数の中のenum animal selected;が呼び出されたあと、
どのように読んで?進んでいったらよいのでしょうか?
enum(列挙体)のenum animal { Dog, Cat, Monkey, Invalid };が
0,1,2,3,の働きをするということは、enum animal select(void)関数
に続くということでしょうか?
本の中に、enum animalが型名、 selectedが変数の宣言となってることも
わかりません。ただmain関数で宣言しているだけなのでしょうか?
switch文の中の (selected = select())もどういう意味なのでしょうか?

enum(列挙体)とenum animal select(void)関数の関係や、
main関数の中のenum animal selected;、
switch文の中の (selected = select())などの説明していただける方
教えてください。よろしくお願いします。

#include <stdio.h>

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);
     } 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);
}

A 回答 (2件)

・enum animal について


enum animal { Dog, Cat, Monkey, Invalid };
で、列挙体(enum)のanimal型というものを宣言しているため、enum animalという形でmain文の中で宣言しています。
typedefしない限りはanimal型の宣言の際に、それが列挙型であることを示すため、頭にenumをつけなければなりません。
つまり、enum animal selected; という文は、{ Dog, Cat, Monkey, Invalid }のどれかの値が入る、selected という変数を宣言した。
ということを言っています。

・selected = select()について
select(void)関数の戻り値(結果)をselectedに代入しています。
その結果をswitch文で振り分けてそれぞれの処理を行っています。

以上です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
{ Dog, Cat, Monkey, Invalid }のどれかの値が入る
selected という変数を宣言をしたという部分と、
selected = select()について書いてくださり、
とてもわかりやすかったです。
selectedも0,1,2,3のどれかを表し、
select(void)関数の戻り値(0,1,2,3)
とイコールの結果でswitch文に行くのですね。
よくわかりました。

お礼日時:2007/02/07 14:31

★解説します。


・まず『select』関数は数値(0~3)の入力を待ちます。
 数値が enum 型の『Dog=0』~『Invalid=3』以外ならば『do-while』文を繰り返します。
 よって enum 型の『Dog=0』~『Invalid=3』範囲ならば、その値(tmp)を返します。
・『main』関数の『switch』文の条件式には enum 型の『Dog=0』~『Invalid=3』が来ます。
 そして『case Dog』、『case Cat』、『case Monkey』でそれぞれの関数を呼び出しています。
 『do-while』文の条件式で『selected』という enum 型変数が『Invalid=無効』以外ならば
 繰り返し、『Invalid=無効』ならばプログラムを終了します。

最後に:
・私は『enum』型はほとんど使った事がありません。でも、その代わりに記号定数を普段は
 使っています。『enum』型を利用した方がコンパイルなどでエラーをチェックできると昔
 C言語を学んでいたときの本などに書かれていました。が、記号定数を使う方向で今日まで
 来ました。
・つまり enum 型は記号定数と同じように単なる定数です。変数とは違います。
 記号定数と違うところは、ある決まったまとまりで定数を管理できるということで、今回の
 テキスト本の『enum animal』というのが決まった定数の塊です。
 変数のように宣言しますが、『selected』には『enum animal』で定義されている定数しか
 代入・管理できません。
・よって enum 型も上手に利用すれば良い効果がありそうです。
・enum 型の定数を次の記号定数で main 関数の意味を探ると分かりやすいですよ。
 #define Dog    (0)
 #define Cat    (1)
 #define Monkey (2)
 #define Invalid  (3)
・以上。おわり。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
#define Dog   (0)
#define Cat   (1)
#define Monkey (2)
#define Invalid (3)
はとてもわかりやすかったです。
『selected』には『enum animal』で定義されている定数しか
入らないというのもよくわかりました。

お礼日時:2007/02/07 14:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!