【C言語】プログラミングに詳しい人列挙体について教えてくれ

1 : 2021/12/08(水) 12:16:05.579 ID:yRxlTfNC0
列挙体の動きが分からんのだわ
詳しい人解説してくれ
2 : 2021/12/08(水) 12:16:23.136 ID:yRxlTfNC0
↓参考書に乗ってたコード

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

3 : 2021/12/08(水) 12:16:36.312 ID:2D0FIEmgd
らっきょ
4 : 2021/12/08(水) 12:16:43.631 ID:WrUD2Na60
enumのこと?
動き???
16 : 2021/12/08(水) 12:20:31.685 ID:yRxlTfNC0
>>4
4つ目の関数のenum animal 関数ってなってるとこと
main関数の enum animal selectedってところが
よくわからない
5 : 2021/12/08(水) 12:17:13.228 ID:bLpN+bqa0
scanfがクソ
6 : 2021/12/08(水) 12:17:40.792 ID:ZXwAZBGo0
ニャ~オ!!
7 : 2021/12/08(水) 12:17:52.165 ID:1SNdhxSF0
C#なら
8 : 2021/12/08(水) 12:18:37.082 ID:bN7PBIt9M
モンキーモンも~んwww
9 : 2021/12/08(水) 12:18:37.756 ID:sh4eZqDla
ワンワン!
10 : 2021/12/08(水) 12:18:58.280 ID:yRxlTfNC0
これをC++の環境でコンパイルしたら
4つ目の関数のenum animal selectの部分で戻り値の型がintでanimal型じゃないと怒られて動かないんだ
14 : 2021/12/08(水) 12:20:14.064 ID:bLpN+bqa0
>>10
キャストしろや
17 : 2021/12/08(水) 12:21:02.488 ID:1SNdhxSF0
>>10
そりゃint tmpをreturnとしてるんだから当たり前だろ
C言語の書き方は知らないけどanimalのtmp番目を返すようにしろ
21 : 2021/12/08(水) 12:23:50.644 ID:yRxlTfNC0
>>17
この参考書がの書き方が悪いってこと?
26 : 2021/12/08(水) 12:27:20.763 ID:fBUuUQujM
>>21
少なくともかなり行儀は悪い
C言語はKR本以外は捨ててよろしい
KR本もかなり古いから全く問題ないとも言えないけど
それでもC言語はあれより良い本はない
28 : 2021/12/08(水) 12:28:34.154 ID:rYej41Z/0
>>17
これ。
11 : 2021/12/08(水) 12:19:03.032 ID:WrUD2Na60
動きも何も
順番に1,2,3て割り当てられてる感じだよ
12 : 2021/12/08(水) 12:20:06.501 ID:fBUuUQujM
原則的にはそのまま整数値と相互にキャストするような使い方したらダメ
サンプルが糞
18 : 2021/12/08(水) 12:22:21.288 ID:yRxlTfNC0
>>12
やっぱ参考書がくそなのか…
13 : 2021/12/08(水) 12:20:13.544 ID:V7/18SKQr
列挙体とか初めて聞いたわ
15 : 2021/12/08(水) 12:20:17.002 ID:UIoJzIJJa
return (animal)tmp
だっけか
型変換忘れた
19 : 2021/12/08(水) 12:23:09.989 ID:fBUuUQujM
tmp < Dog
なんかも同じだけれど明治的にキャストすればコンパイルは通るけど通れば良いってもんでもない
どんな参考書使ってんだよ
20 : 2021/12/08(水) 12:23:33.092 ID:XaaMTAU10
Cよく知らんけどenum animal selectedはただの宣言じゃないの?
その後select()を代入してるし
22 : 2021/12/08(水) 12:24:37.239 ID:4Zrydh6E0
enum自体が不要なので憶えんでよろしい
23 : 2021/12/08(水) 12:24:53.630 ID:XaaMTAU10
Cってこういう初期化しない変数宣言って結構あるの?
null safeな言語ばっかり触ってるから違和感結構あるな
27 : 2021/12/08(水) 12:27:37.841 ID:LyzWNP/Qa
>>23
型宣言だけってのはあり得る
でも初期化しないとアドレスが入ってることがあるから
型宣言ついでに初期化した方が扱いやすいというか
バグを踏みにくくなる
32 : 2021/12/08(水) 12:32:36.776 ID:XaaMTAU10
>>27
なるほどなー
Dogにプロパティ参照みたいな形(animal.Dog)でアクセスしないのもなんかすごいね
Cはクラスないから被ることはないのかな
34 : 2021/12/08(水) 12:35:00.484 ID:pNOelWCHa
>>32
構造体はあるよ
構造体の中には変数定義も確かメソッド定義もできたはず
クラスとの違いはアクセス修飾子の有無だったはずだけで
構造体は全部public扱い
25 : 2021/12/08(水) 12:26:13.401 ID:yRxlTfNC0
列挙体って動きとしては
#define の型変換と同じってことでいいか?
コンパイルするときDogが0に置き換わるみたいな感じで?
31 : 2021/12/08(水) 12:30:51.596 ID:yRxlTfNC0
>>25
これ教えて欲しいわ
実際あんまり使わんらしいし
この認識でいいなら列挙体ってあったなあってことで脳みその片隅に閉まっておくんだが
29 : 2021/12/08(水) 12:30:32.765 ID:RQZdCTOw0
中の数値を意識しないでいいようにする為の列挙体なのに
名前に特定の値が入っている想定してるのはマズいよね

コメント

タイトルとURLをコピーしました