質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

1626閲覧

if文と列挙型を使ったコードが正常に動作しないので理由が知りたいです。

former_neet_cat

総合スコア46

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/09/02 12:06

編集2018/09/02 12:21

前提・実現したいこと

自分で列挙型を使った文をテキトーに作って試して動かしていたのですが、コードを思うように動かせません。
試行錯誤して、動作させたのですが解決した理由が理解できませんでした。

なぜ、enumで数字を決めないと表示されないのか?
分からないので説明をお願いします。

発生している問題

typedef enum {MALE = 1, FEMALE = 2} Gender;

と数字を = で書かないと、

if (age >= 13 && gender_m)

が動作しないという問題

該当のソースコード

lang

1#include <stdio.h> 2#include <stdlib.h> 3#include <stdbool.h> 4 5typedef char String[1024]; 6 7int main(void) 8{ 9 typedef enum {MALE, FEMALE} Gender; //この文 10 String sage; 11 String snumber; 12 13 printf("Please input age.\n"); 14 scanf("%1023s%*[^\n]%*c", sage); 15 int age = atoi(sage); 16 17 printf("Please fill in the gender by number : mail 1 , female 2\n"); 18 scanf("%1023s%*[^\n]%*c",snumber); 19 int number = atoi(snumber); 20 21 if (number == 1) 22 { 23 Gender gender_m = MALE; 24 25 if (age >= 13 && gender_m) 26 27 { 28 printf("You are not a boy!\n"); 29 } 30 else if (age < 13 && gender_m) 31 { 32 printf("You are a boy!!\n"); 33 } 34 35 } 36 else if (number == 2) 37 { 38 Gender gender_f = FEMALE; 39 40 if (age >= 13 && gender_f) 41 { 42 printf("You are not a girl!!\n"); 43 } 44 else if (age < 13 && gender_f) 45 { 46 printf("You are a girl!!\n"); 47 } 48 49 } 50 else 51 { 52 printf("Error\n"); 53 } 54 55/*ラベルに変数が入ってしまうので無理? 56 switch (number) 57 { 58 case 1: 59 Gender gender_m = MALE; 60 break; 61 case 2: 62 Gender gender_f = FEMALE; 63 break; 64 default: 65 printf("Eroor!\n"); 66 } 67*/ 68 69/*試した文 70 71 72 if (number == 1) 73 { 74 if (age >= 13 && number == 1) 75 76 { 77 printf("No m!!\n"); 78 } 79 else if (age < 13 && number == 1) 80 { 81 printf("Yes m!!\n"); 82 } 83 84 } 85 else if (number == 2) 86 { 87 if (age >= 13 && number == 2) 88 { 89 printf("No f!!\n"); 90 } 91 else if (age < 13 && number == 2) 92 { 93 printf("Yes f!!\n"); 94 } 95 } 96 else 97 { 98 printf("Error\n"); 99 } 100 */ 101 102 103 104 105 return 0; 106} 107 108 109 110 111

補足情報

vimを使って書いています

###修正箇所
表記ミスを修正

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

C

1 Gender gender_m = MALE; 2 3 if (age >= 13 && gender_m)

が意味不明です。これは、MALE0なので、

C

1 int gender_m = 0; 2 3 if (age >= 13 && gender_m)

と同じです。
そもそも、その前に、if (number == 1)なので、ここに来るときは男性に決まっています。単に、

C

1 if (age >= 13)

でいいのでは?

投稿2018/09/02 12:26

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

former_neet_cat

2018/09/02 12:58

解りやすい解説ありがとうございます。 確かに、酷いコードですが、どうしてもenumの列挙型と演算子の&&などを使って動かしたかったのでこんなコードになってしまいましたね。 入門書片手にやってます・・・
guest

0

まず、あなたの言う動作しないというのはどういう状態のことを言ってるのでしょうか。

また、

if (age >= 13 && gender_f)

これは、どういう意図のif文でしょうか。

if (age >= 13 && gender_f == FEMALE)

とかじゃないとダメなのでは


enum は、特別の表記がない場合は0から始まります

if (age >= 13 && gender_f)

たんにgender_f に0が入ってるだけの話ですね

投稿2018/09/02 12:21

編集2018/09/02 12:24
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

gender_m を表示してみてください。0(つまり FALSE)になっているのでは?

投稿2018/09/02 12:20

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

former_neet_cat

2018/09/02 12:52

ありがとうございます。 おかげで理解できました。 c言語では条件式がbool型にならない場合は、if文は結果が0以外ならtrue,0ならfalseなんですね。
guest

0

質問の意図がイマイチわかりませんが、

typedef enum {MALE, FEMALE} Gender;

というのは

enum {MALE, FEMALE}

という型にGenderという別名をつける構文ですよね。

投稿2018/09/02 12:10

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

former_neet_cat

2018/09/02 12:17

そうです。 質問の意図は、 typedef enum {MALE, FEMALE} Gender; で数字を代入しないと、 if (number == 1) { Gender gender_m = MALE; if (age >= 13 && gender_m) { printf("You are not a boy!\n"); } else if (age < 13 && gender_m) { printf("You are a boy!!\n"); } の部分で、条件を満たしてるはずの入力でも、printf(内容)が表示されないということなのです。 その理由が分からないのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問