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

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

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

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

Q&A

解決済

4回答

2305閲覧

c言語 return 0; があると思ったように動かなくなるプログラム

ziryuu

総合スコア8

C

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

0グッド

0クリップ

投稿2019/12/03 11:16

数を10個まで入力、-1が入力されたら1から100まで範囲で最大、最小を探すプログラムです。
例えば1 2 3 4 5 6 -1と入力すると最大値:1最小値:1となり思ったように動きません
しかしmaxmin関数のreturn 0;を外すと正常に動きます何故でしょうか?return 0;の役割とは?
慣習的に書くことの多いであろうreturn 0;で異常となるのは気持ちが良くないので対処方も教えてもらいたいです。
c言語はポインタまで学習してる状態です。

c

1#include <stdio.h> 2 3void maxmin(int array[],int *max,int *min); 4 5int main(void) 6{ 7 int i = 0,array[10],max,min; 8 9 do { 10 printf("%d 番目の数:",i + 1); 11 scanf("%d",&array[i]); 12 i++; 13 } while (array[i - 1] != -1); 14 15 maxmin(array,&max,&min); 16 17 printf("最大値 %d : 最小値 %d\n",max,min); 18 19 return 0; 20} 21 22void maxmin(int *array,int *max,int *min) 23{ 24 int i = 0; 25 26 *max = 0; 27 *min = 100; 28 29 while (array[i] != -1) { 30 if (array[i] > *max) *max = array[i]; 31 if (array[i] < *min) *min = array[i]; 32 i++; 33 return 0; 34 } 35}

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

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

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

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

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

cateye

2019/12/03 11:23

void(復帰値がない)関数で0を返すのは何故でしょう?
ziryuu

2019/12/11 07:57

関数を終了する時に真を表すためみたいですけど、何のために真を返してるのでしょうか、別に0でなくとも動くというのに。 自分のはreturnで終了してるからうまくいかないだけみたいですね。
guest

回答4

0

return 0;の役割とは?

そこで関数の実行を終了して、関数呼び出し元にint型の0を返すという意味です。

慣習的に書くことの多いであろうreturn 0;で異常となるのは気持ちが良くないので

return 0;を慣習的に書くことは無いです。必要があるときだけ書きます。
そもそも、プログラムの中で慣習的に書くものなどありませんよ。すべて意味があって書いています。

初心者に教えるときに「これはおまじないとして書いておく」みたいな説明をする人がいますが、それは善意に解釈すると、あくまで入門したての人が本質的でない部分を気にしすぎないようにするために言ってるんだと思います。

投稿2019/12/03 16:06

otn

総合スコア84645

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

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

ziryuu

2019/12/11 08:08 編集

変数=自作関数;で return 0;を返すと変数にはint型0が代入されるんですね。 普段main関数でreturn 0;を書くのは、自作関数で関数を返し忘れるのを普段から心がけて書いてるみたいな理由でもなく、何かの本質自体はあるってことになるんですかね。
guest

0

while (array[i] != -1) {

if (array[i] > *max) *max = array[i]; if (array[i] < *min) *min = array[i]; i++; return 0; }

return の場所間違ってますね

投稿2019/12/03 11:26

y_waiwai

総合スコア87784

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

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

ziryuu

2019/12/11 08:11

ありがとうございます。
guest

0

while (array[i] != -1)

は、一回しか実行されませんが?

投稿2019/12/03 11:25

cateye

総合スコア6851

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

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

ziryuu

2019/12/11 08:09 編集

retrn 0; printf("文字列"); としても「文字列」は表示されないみたいにretrnは関数を終了させるのですね。
guest

0

ベストアンサー

コードは書かれたとおりに上から処理していきます

return は別の言い方をすれば「右にあるデータを伴って終了する」みたいな意味です。
(厳密には違いますが)

"return 0" とあれば 0 というデータを伴って終了します。

関数は ( "■" を半角スペースと見立てて書くと )

型■関数名(引数){ // 処理内容 return■戻り値; }

が基本となります。

型 = 戻り値(の型) です。

よってWarningなりErrorなりがでているはずですが。

return 0; とするのは、あくまで「C言語にはbool ( 言語によってはBooleanとか ) がないため」です。

そこで boolの代わりに intで代用して、( main関数の場合は慣習的に ) 0 が成功、それ以外 ( マイナス値だったりとか ) ならそれぞれのエラーとしてやっています。

もし「成功した数を返す」というような個数系の値なら 0 を失敗 ( 何もない )、(1以上の)正の数なら成功した数...みたいにしますし、

0が意味を持つ場合 ( 例えば 文字列から整数を取り出すとか ) なら、負の数をエラー値、0は成功はしたが個数や値が0, 正の数なら個数...みたいにすることもありますね。

そういう風に意味が異なってきます。

C

1void maxmin(int *array,int *max,int *min) 2{ 3 int i = 0; 4 5 *max = 0; 6 *min = 100; 7 8 while (array[i] != -1) { 9 if (array[i] > *max) *max = array[i]; 10 if (array[i] < *min) *min = array[i]; 11 i++; 12 return 0; 13 } 14}

を読んでみると、

C

1void maxmin(int *array,int *max,int *min) 2{ 3 int i = 0; 4 5 // 念のため初期設定(厳密には初期設定じゃないけど...) 6 *max = 0; 7 *min = 100; 8 9 // -1 がでるまでループ 10 while (array[i] != -1) { 11 // max より大きければ 付け替え 12 if (array[i] > *max) *max = array[i]; 13 // 同上( 向きが違うだけ ) 14 if (array[i] < *min) *min = array[i]; 15 // 次に進ませる 16 i++; 17 // 0 を伴って終了 18 return 0; 19 } 20}

というような状態なので、疑似コード(ぽい何か)で書くと、

1. 念のため初期設定 2. -1 がでるまでループ 2.1. maxより大きければ... 2.2. minより小さければ... 2.3. (0) を伴って終了

みたいになるので、

最大要素数である 10 まで -1 以外の値が入っていても初回 whileに突入して 2.3. で関数そのものから抜けているので whileの先端に来ることはありません。

よって 多くても1回しか動かない。( 0番目がすでに -1 なら条件式を満たしていないからスルー。 )

なので、2.3. の位置に return を持ってくるのではなくて、3. 辺りに持ってくること。

あるいは while内にif文を設けて、「100という値が出た場合は強制的に関数から抜ける」みたいにするなら別ですが、今回の場合は関係がありませんから、

2.3. の位置ではなく 3. の位置に持ってくる。

また、関数の型が void になっているので return; でいいです。
(最後まで到達するのなら return; も不要という説もあるが...)

投稿2019/12/04 02:57

BeatStar

総合スコア4958

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

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

ziryuu

2019/12/11 08:10

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問