このエピソードを読む
2018年8月4日 16:18
すみません、質問なんですが戻り値がないのとあるのとではどんな違いがあるのでしょうか?読んでたら戻り値のメリットが無い、もしくは戻り値があってもなくても何も関係ないように感じました。return. にする必要性と return0にする必要性を教えて欲しいです!
作者からの返信
こんにちは ご質問ありがとうございますソーラーといいます。よろしくお願いいたします。関数の戻り値についてですね。関数の戻り値というのは自分で自由に設定することができます。次のプログラムをみてね。🌞#include <stdio.h>int newmadefunction(void){printf("今日もよいC言語日和です。\n");return 1;}int main (void){newmadefunction();return 0;}コンパイル結果今日もよいC言語日和です。ソーラー「この👆のプログラムでは自作関数の戻り値はreturn 1;により1となっているのがわかりますそしてmain関数の戻り値はreturn 0;より0となっているのがわかります。ははっでも自作関数main関数であるにかかわらず関数の戻り値は自由に設定できるので次のプログラムのように自作関数とmain関数の戻り値を設定してもちゃんとコンパイルできます。#include <stdio.h>int newmadefunction(void){printf("今日もよいC言語日和です。\n");return 10000;}int main (void){newmadefunction();return 100000000;}コンパイル結果今日もよいC言語日和です。ソーラー「自作関数の戻り値が10000main関数の戻り値が100000000となっています。このプログラムの記述でも問題はありません。つまり関数の戻り値は自分で🐤自由に🐤設定できるんだreturn 0;にこだわる必要はありません。例えばmain関数の戻り値をもたないようにすることもできます。そのプログラムは次のようになります。#include <stdio.h>int newmadefunction(void){printf("今日もよいC言語日和です。\n");return 10000;}void main (void){//戻り値を格納しないのでint型ではなくvoid型に変更しましたnewmadefunction();return ;}コンパイル結果今日もよいC言語日和です。ソーラー「main関数の戻り値を0にしなくてもあるいはmain関数に戻り値を持たせないようにしてもちゃんとコンパイルできます。ただmain関数が戻り値を持たない場合はint型からvoid型に戻り値を格納する型を変更しなくちゃだめだね。ではなぜmain関数の戻り値は0に設定されているのでしょうか?main関数がうまく実行されると戻り値は🌞🌞🌞🌞🌞🌞自分が設定した戻り値が🌞🌞🌞🌞🌞🌞main関数に戻されます。0に設定していれば0が1000000に設定していれば1000000がです。ここで戻り値0がmain関数に返されるとします。コンピュータはメモリに格納しなければデータを取り扱えないのでもちろん戻り値0はコンピュータのメモリに格納されます。実はこのメモリに格納された戻り値0を閲覧する方法がありmain関数が実行された後0が戻り値としてもどっているな~~と確認することができます。つまり戻り値0が戻っているのでmain関数がうまく実行されたのがわかるというわけです。うまく実行されていなければ別の数値が戻り値としてもどっています。つまりmain関数がうまく実行されているのを確認するために戻り値を0に設定しているんだね。ということはmain関数がうまく実行されたときに戻り値を0にするか戻り値を1000000にするかはどちらでも自分に好きなようにすればいいということになるんだよ。自分が確認するための数値だからね。やったね(´▽`*)一応慣例としてmain関数がうまく実行されたときの戻り値は0にしようということになっています。ではC言語の世界を楽しんでください。立派なクリエイターにお送りしました。」追記ふたたび参上しました。ちょっとわかりにくいところがあると思うのでもう少しくわしく解説してみます本文でmain関数が 🌞うまく🌞実行されたなら戻り値0がメモリに格納されますという文章がありますね。この説明をわすれちゃってたな。まずこのmain関数が 🌞うまく実行される🌞とはどういうことなのかこれを説明したくてしたくてとりあえず次のプログラムをご覧ください#include <stdio.h>int main(void){ printf("Hello, world"); return 0;}コンパイル結果Hello, worldこのプログラムではmain関数が🌞うまく🌞実行されていますところでプログラムをコンパイルしたときプログラムの記述にミスがあればコンパイルエラーとなりプログラムの記述ミスを指摘されます。今のプログラムはプログラムの記述ミスがなかったためコンパイルエラーが表示されることもなくプログラムが実行されました。つまりプログラムの記述にミスはなかったというわけです。ここがミソなんだ~たとえプログラムの記述にミスがなかったとしてもプログラムがうまく実行されない場合があります。プログラムの記述にミスがないのにプログラムがうまく実行されない場合があるの???と思われるかな。あるんです。たとえば極端な話ですがコンピュータは機械語にコンパイルされたプログラムを実行するときまずその機械語にコンパイルされたプログラムをメモリに格納します。メモリが不足していてプログラムがメモリに格納できなかった場合そのプログラムを実行することはできません。もちろんこのときは戻り値0がメモリに格納されることはありません。このときはシステムエラーの表示がOSによって表示されるとおもいます。つまりmain関数がうまく実行されていったならreturn 0;の命令文にたどり着けるので戻り値0がメモリに格納されるというわけなんだ。」
すみません、質問なんですが戻り値がないのとあるのとではどんな違いがあるのでしょうか?
読んでたら戻り値のメリットが無い、もしくは戻り値があってもなくても何も関係ないように感じました。
return. にする必要性と return0にする必要性を教えて欲しいです!
作者からの返信
こんにちは ご質問ありがとうございます
ソーラーといいます。
よろしくお願いいたします。
関数の戻り値についてですね。
関数の戻り値というのは自分で自由に設定することができます。
次のプログラムをみてね。🌞
#include <stdio.h>
int newmadefunction(void){
printf("今日もよいC言語日和です。\n");
return 1;
}
int main (void){
newmadefunction();
return 0;
}
コンパイル結果
今日もよいC言語日和です。
ソーラー「この👆のプログラムでは
自作関数の戻り値
はreturn 1;
により
1
となっているのがわかります
そして
main関数の戻り値は
return 0;
より
0
となっているのがわかります。
ははっ
でも
自作関数
main関数であるにかかわらず
関数の戻り値は自由に設定できるので
次のプログラムのように
自作関数と
main関数の
戻り値を設定しても
ちゃんとコンパイルできます。
#include <stdio.h>
int newmadefunction(void){
printf("今日もよいC言語日和です。\n");
return 10000;
}
int main (void){
newmadefunction();
return 100000000;
}
コンパイル結果
今日もよいC言語日和です。
ソーラー「自作関数の戻り値が10000
main関数の戻り値が100000000
となっています。
このプログラムの記述でも問題はありません。
つまり
関数の戻り値は自分で🐤自由に🐤設定できるんだ
return 0;
にこだわる必要はありません。
例えばmain関数の戻り値をもたないようにすることもできます。
そのプログラムは次のようになります。
#include <stdio.h>
int newmadefunction(void){
printf("今日もよいC言語日和です。\n");
return 10000;
}
void main (void){
//戻り値を格納しないのでint型ではなくvoid型に変更しました
newmadefunction();
return ;
}
コンパイル結果
今日もよいC言語日和です。
ソーラー「main関数の戻り値を0にしなくても
あるいは
main関数に戻り値を持たせないようにしても
ちゃんと
コンパイルできます。
ただ
main関数が戻り値を持たない場合は
int型からvoid型に戻り値を格納する型を変更しなくちゃだめだね。
ではなぜ
main関数の戻り値は0に設定されているのでしょうか?
main関数が
うまく実行されると
戻り値は
🌞🌞🌞🌞🌞🌞自分が設定した戻り値が🌞🌞🌞🌞🌞🌞
main関数に戻されます。
0に設定していれば0が
1000000に設定していれば
1000000がです。
ここで
戻り値0が
main関数に返されるとします。
コンピュータはメモリに格納しなければ
データを取り扱えないので
もちろん
戻り値0はコンピュータのメモリに格納されます。
実は
このメモリに格納された戻り値0を閲覧する方法があり
main関数が実行された後
0が戻り値としてもどっているな~~
と確認することができます。
つまり
戻り値0が戻っているので
main関数がうまく実行されたのがわかるというわけです。
うまく実行されていなければ
別の数値が戻り値としてもどっています。
つまり
main関数がうまく実行されているのを確認するために
戻り値を0
に設定しているんだね。
ということは
main関数がうまく実行されたときに
戻り値を0にするか
戻り値を1000000
にするかは
どちらでも
自分に好きなようにすればいいということになるんだよ。
自分が確認するための数値だからね。
やったね(´▽`*)
一応
慣例として
main関数が
うまく実行されたときの戻り値は
0
にしよう
ということになっています。
では
C言語の世界を楽しんでください。
立派なクリエイターにお送りしました。」
追記
ふたたび参上しました。
ちょっとわかりにくいところがあると思うので
もう少しくわしく解説してみます
本文で
main関数が 🌞うまく🌞
実行されたなら戻り値0がメモリに格納されます
という文章がありますね。
この説明をわすれちゃってたな。
まず
この
main関数が
🌞うまく実行される🌞とは
どういうことなのか
これを説明したくてしたくて
とりあえず次のプログラムをご覧ください
#include <stdio.h>
int main(void){
printf("Hello, world");
return 0;
}
コンパイル結果
Hello, world
このプログラムでは
main関数が🌞うまく🌞実行されています
ところで
プログラムをコンパイルしたとき
プログラムの記述にミスがあれば
コンパイルエラーとなり
プログラムの記述ミスを指摘されます。
今のプログラムはプログラムの記述ミスがなかったため
コンパイルエラーが表示されることもなく
プログラムが実行されました。
つまり
プログラムの記述にミスはなかったというわけです。
ここがミソなんだ~
たとえプログラムの記述にミスがなかったとしても
プログラムがうまく実行されない場合があります。
プログラムの記述にミスがないのに
プログラムがうまく実行されない場合があるの???
と思われるかな。
あるんです。
たとえば極端な話ですが
コンピュータは
機械語にコンパイルされたプログラムを
実行するとき
まず
その機械語にコンパイルされたプログラムを
メモリに格納します。
メモリが不足していて
プログラムがメモリに格納できなかった場合
そのプログラムを実行することはできません。
もちろん
このときは戻り値0が
メモリに格納されることはありません。
このときはシステムエラーの表示が
OSによって表示されるとおもいます。
つまり
main関数がうまく実行されていったなら
return 0;
の命令文にたどり着けるので
戻り値0が
メモリに格納されるというわけなんだ。」