
下記、勉強中の本から抜粋したものです。
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);
}
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文で振り分けてそれぞれの処理を行っています。
以上です。
回答ありがとうございます。
{ Dog, Cat, Monkey, Invalid }のどれかの値が入る
selected という変数を宣言をしたという部分と、
selected = select()について書いてくださり、
とてもわかりやすかったです。
selectedも0,1,2,3のどれかを表し、
select(void)関数の戻り値(0,1,2,3)
とイコールの結果でswitch文に行くのですね。
よくわかりました。
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)
・以上。おわり。
回答ありがとうございます。
#define Dog (0)
#define Cat (1)
#define Monkey (2)
#define Invalid (3)
はとてもわかりやすかったです。
『selected』には『enum animal』で定義されている定数しか
入らないというのもよくわかりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ifstreamについて
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
2曲同時再生するにはどうした...
-
ある商品のロス率を5%見込み、...
-
有効数字について 以前質問をし...
-
int16_t の _t は何?
-
fgetsについて
-
マイナスからプラスへ転じた時...
-
三角形の判別
-
プログラムでの数字につく”f”の...
-
std::set<int> で、ある値が何...
-
c言語で、繰り返し文の中で、0....
-
2重定義って??
-
Excel VBAで、Application.Inpu...
-
C言語のwhile文を使った素数判...
-
火災保険の値上げについて
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
エクセルで可視セルにのみ値貼...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
静的でないメンバ関数の呼び出...
-
既定のコンストラクタがありま...
-
C++にてtemplateで受け取った任...
-
多重定義が起きている?--lnk20...
-
【gcc・cygwin】multiple defin...
-
const_castのつかいどころを教...
-
戻り値を返す関数の前に(void)...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
C# Controls.Addで動的に配置し...
-
C#でテンキーの操作は可能でし...
-
int main()、void main()、void...
-
C# KeyDownイベントでショート...
-
gcc: incompatible pointer type
-
Notepad++の関数リスト表示の変...
-
(void)0 はどんな意味ですか
-
VC++でGetKeyboardStateがうま...
-
関数ポインタについて
-
void main()って誰が最初?:AN...
-
演算子のオーバーロードでコン...
-
この式の意味
おすすめ情報