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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

3回答

1138閲覧

C言語での実行結果が意図したものと違う

owl_AtR

総合スコア7

C

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

1クリップ

投稿2017/11/13 10:41

C言語で自然数を3つ打つと最も大きな自然数を排出してくれるコードを書いています。

#include <stdio.h>

int main(){
int x,y,z;
printf ("1つめの自然数を入力してください。"); scanf ("%d",&x);
printf ("2つめの自然数を入力してください。"); scanf ("%d",&y);
printf ("3つめの自然数を入力してください。"); scanf ("%d",&z);
if (x > y && z){
printf ("%dが最も大きい自然数です。",x);
}
else if (y > x && z){
printf ("%dが最も多きい自然数です。",y);
}
else if (z > x && y){
printf ("%dが最も大きい自然数です。",z);
}
}

この様なものを書きました。

しかし、一つ目に2.二つ目に1,三つ目に3、と打つと最も大きな自然数が2と出てきてしまいます。

何故でしょうか?

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

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

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

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

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

guest

回答3

0

2 < 1 && 3

の時、2が最も大きいと出力されてしまうのはどうしてなんでしょう?

端的にいうと、やりたいことと書いてることが違うからです。

C

1if (x > y && z){ 2} else if (y > x && z){ 3} else if (z > x && y){

上から順に、

  • xがyより大きい、かつ、zが0でない
  • 上記を満たさない場合、yがxより大きい、かつ、zが0でない
  • 上記を満たさない場合、zがxより大きい、かつ、yが0でない

と、書いてあります。
cateyeさんがコメントしているのは、
2>1 && 3 != 0って書いてあるので、xが表示されます。という指摘です。

書きたかったのは、

C

1if (x > y && x > z)

みたいな感じでしょうか。(同じ値だと何も出力されないケースがありますが)

ちなみに・・・
if文の評価はゼロ(false)でないことを確認するので、zとかyを、そのまま書いちゃうと
z が 0でなければ、この部分は真になります。(これに加えて、x > yが真なので、x が表示されます)

投稿2017/11/13 11:36

momon-ga

総合スコア4820

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

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

owl_AtR

2017/11/13 12:25

if文の評価というものを初めて知りました!そうなんですね! ご回答頂きありがとうございました
guest

0

ベストアンサー

c

1include <stdio.h> 2 3int main(){ 4 int x,y,z; 5 6 printf ("1つめの自然数を入力してください。"); scanf ("%d",&x); 7 printf ("2つめの自然数を入力してください。"); scanf ("%d",&y); 8 printf ("3つめの自然数を入力してください。"); scanf ("%d",&z); 9 10 if (x > y && z){ 11 printf ("%dが最も大きい自然数です。",x); 12 } 13 else if (y > x && z){ 14 printf ("%dが最も多きい自然数です。",y); 15 } 16 else if (z > x && y){ 17 printf ("%dが最も大きい自然数です。",z); 18 } 19}

ご質問の際、回答者が見やすいように、
上のようにコードは必ず囲んでください。

それに、見やすくなるだけで、問題解決に一歩前進します。


C

1#include <stdio.h>

まず、プリプロセッサには、冒頭に「#」が要ります。

C

1 if (x > y && x > z){

さて本題、上のような判定に、if文の各行を直せば良いでしょう。

ご質問のコードで想定しているような使い方はできないんですね。
細かい仕様は、「C言語 論理演算子」で検索して調べてください。

C

1printf ("x: %dが最も大きい自然数です。",x);

あと細かいですが、xyzを区別する表現を入れた方が良いと思います。
そういう風に、プログラム内部の情報を増やすと、間違いが減ります。

投稿2017/11/13 11:13

LLman

総合スコア5592

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

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

owl_AtR

2017/11/13 11:18 編集

回答してくださりありがとうございます。 このサイトを使用するのが初めてだったのですみません…次回からは見やすいよう質問させて頂きます! #の抜けはコピーする際に抜けてしまった様です。 if文の各行は指摘いただいたとおりに直しておきます。 C言語 論理演算子で検索してみたいと思います。 お力添えありがとうございました!
guest

0

c

1if (x > y && z){

は、 x > y と同時に z を評価します。
C の条件文の真偽値は、0 が 偽、0以外は 真になります。
x > y で z が 0でなければ、この条件文は真になります。

よって

c

1printf ("%dが最も大きい自然数です。",x);

が出力されます。

投稿2017/11/13 10:46

編集2017/11/13 10:55
showkit

総合スコア1638

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

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

LouiS0616

2017/11/13 10:48

> z が 0でなければ、この条件文は 常に真になります。 論理積において、これは誤りでは?
showkit

2017/11/13 10:54

失礼、見誤っていました。
cateye

2017/11/13 10:56

>x > y と同時に z を評価します。 ではなく"x > y" が成り立つときに z を評価します。ですねd^^; ・・・したがって、 2>1 && 3 != 0・・・と評価されます。
owl_AtR

2017/11/13 11:13

すいません…ほんとに初心者なんで仰っている意味がよく理解出来ていません… 2 < 1 && 3 の時、2が最も大きいと出力されてしまうのはどうしてなんでしょう?
owl_AtR

2017/11/13 11:20

解決致しました! 皆さんご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問