
下記、勉強中の本から抜粋したものです。
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
静的でないメンバ関数の呼び出...
-
Notepad++の関数リスト表示の変...
-
【gcc・cygwin】multiple defin...
-
別ソースファイル、同クラス名...
-
C++にてtemplateで受け取った任...
-
LEDで電光掲示板に「A B C D E...
-
Arduinoでコンパイルエラーにつ...
-
const_castのつかいどころを教...
-
多重定義が起きている?--lnk20...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
shared_ptrからpimplのデストラ...
-
unityの教科書のゲームを作って...
-
void main()って誰が最初?:AN...
-
組み込みマイコン
-
既定のコンストラクタがありま...
-
二重定義の回避法
-
メッセージマップ(ON_CONTROL_...
-
LNK2019:未解決の外部シンボル ...
-
解凍ソフト(C++builderで作成...
-
int main()、void main()、void...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
多重定義が起きている?--lnk20...
-
const_castのつかいどころを教...
-
C++にてtemplateで受け取った任...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
gcc: incompatible pointer type
-
_beginthreadにて発生するコン...
-
C#でラジオボタンを設定に記録...
-
C#でテンキーの操作は可能でし...
-
C++別のオブジェクトからメンバ...
-
CTabCtrl:TABインデックス単位...
-
見た目は同じソースなのにエラ...
-
pictureboxの画像を削除するには?
-
【VC++6.0】イベントハンドラ関...
おすすめ情報