🌞自作関数4 main関数には なぜ先頭にInt型 がくっついているのでしょうか return 0; は 何のためにあるのでしょうか? 

アレサとソーラー

「この自作関数のように

  👇

void newmadefunction(void){

printf("今日もよいC言語日和です。\n");

return ;

}



void 型の自作関数で


return;


が設定されている場合は


戻り値が格納されません


void型には戻り値は格納されないし


return;


は


戻り値を返しません。


このような場合は


return;を省いて


void newmadefunction(void){

printf("今日もよいC言語日和です。\n");

}


と記述することもできます。


次のプログラムが実際に実行できるかかどうかためしてみましょう。


#include <stdio.h>


void newmadefunction(void){

printf("今日もよいC言語日和です。\n");

}


int main (void){

newmadefunction();

return 0;

}


それっ


コンパイル結果は

(EAZY IDECの場合)

(Visual Studioの場合)


今日もよいC言語日和です。


と無事に実行できています。


自作関数の定義内のreturn;以外にも


main関数内にも return 0;があります。」


ソーラー 「return 0;により


0を戻り値としてmain関数にあたえているんだね。


その0を格納するために変数の型intがmain関数の前についているんだ」


アレサ

「main関数のブロック{}内で


return 0; と記述されていますが


return 0;をつかって


戻り値0をmain関数に返す必要がないので


return 0;


を


記述する必要がないようにおもえますの


戻り値0をmain関数がうけとることに意味があるのでしょうか?」


ソーラー 「確かに そうかもしれないかな~っと


だってぇ


int main(void){}の記述において


main関数の引数はvoidとなっています。



つまりmain関数は引数を受け取らないという設定になっている


このように


最初からmain関数が引数を受け取らなければ 


いろいろな値をもつ引数がmain関数に与えられ


いろいろな値にmain関数の戻り値が変化するということもないから


int型をつかって戻り値を格納するまでもないかな。 」


アレサ 「つまり


戻り値が変化しないので


int型でなく


最初から戻り値をうけとらない


void型にし


return 0;を省いても よいということですね


つまり


main関数は


void main(void){}


と


戻り値を格納する型がvoid型で


main関数のブロック{}内には


return;


が記述されていてもよいはずです。


ですが


main関数は


int main(void){}


と


戻り値を格納する型がint型で 


main関数のブロック{}内には


return 0;と記述されています。


なぜでしょっか? かわいらしいです。」


ソーラー 「 ほんとだよね そこが愛嬌のあるところだね。」


アレサ  「今、すこし調べたところによると


どうやらint型に 0とmain関数の戻り値を格納するのは


プログラムの実行が無事に終了したのを


確認するためにあるようです。」


ソーラー 「ここら辺はコンピューターの仕組みにかかわっている


ようです。読者の皆さんもお知りになりたいところですね。


そこらへんは新たな小説


天国にいけるまで機械語で遊んでみよう 


内で解説してみよう。ね、アレサ。」


アレサ 「はい、ソーラーさん。」


ソーラー「そこまでまてないの


という方は


次の文書をご覧ください」


アレサ「ご覧ください😊」



🌞  🌞  🌞  🌞  🌞  🌞  🌞  🌞



こんにちは ご質問ありがとうございます


ソーラーといいます。


よろしくお願いいたします。


関数の戻り値についてですね。


関数の戻り値というのは自分で自由に設定することができます。


次のプログラムをみてね。🌞


#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が


メモリに格納されるというわけなんだ。


すると

後で 0がメモリに格納されているのを確認できますね。


一応プログラムは実行されていることが確認できるというわけです。



🌞  🌞  🌞  🌞  🌞  🌞  🌞  🌞













  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます