• ベストアンサー

列挙体(enum)と関数教えてください。

下記、勉強中の本から抜粋したものです。 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); }

質問者が選んだベストアンサー

  • ベストアンサー
  • addle
  • ベストアンサー率50% (1/2)
回答No.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文で振り分けてそれぞれの処理を行っています。 以上です。

ki_c
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★解説します。 ・まず『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) ・以上。おわり。

ki_c
質問者

お礼

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

すると、全ての回答が全文表示されます。

関連するQ&A