プロが教えるわが家の防犯対策術!

C言語を独学で勉強中です。
最初から分からないのがあったので、質問させていただきます。

#include <stdio.h>

main()
{
printf("Hello World!!\n");
return(0);
}

return(0)を記入しなくてもエラーはでないのに、
なぜ必要なんですか?
参考書には何も書いてないので分かりません。

よろしくお願いします。

A 回答 (10件)

> >まず、返却値の型のintは省略することができません(少なくとも現行規格では)。


> お二方、古い話を書かないでください。
> 現行規格のC99またはJISCのX3010:2003ではintでなくても良くなっています。

それはmain関数が処理系定義の形式でも構わないということであって、返却値の型であるintという記述を省略してよいかどうかとは、まったく別の話です。

> 処理系云々の話や、規格云々はあくまでもCはこうあるべき
> という枠のようなもので、実際に規格に沿ったコンパイラは
> それほど多くないので、厳密にそこまでこだわる必要は
> 無いかもしれませんが。(とくにC99は。。。)

私もこの意見には賛成です。
だからこそ、自分が使っている、あるいは対象としている処理系が何であるかを明確にする必要があります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

質問する前にもう少しC言語に対して勉強するべきだったと
反省しています。親切に回答していただいたのに、勉強不足
で申し訳ありませんでした。

回答なんですが、return0;が無いと明確さに欠けるので、
記述したほうがいいということですよね。
見やすく明確に!ですね。

分からないことがあるときはまた質問させていただきます。
ありがとうございました!!

お礼日時:2008/02/23 22:41

> return(0)を記入しなくてもエラーはでないのに、



コンパイル時に警告が出ませんか?
出たのであれば、極力出ないようにする方がよいと思います。
    • good
    • 0

昔のCでは関数に戻り値型を書かない場合int型となります。


同じように引数を書かないと無しと見なされます。

エラーがでるか警告が出るか何もでないかは、
処理系の設定や処理系そのものに依存すると思いますが
少なくともmain()はこの場合だとint型を返す引数を取らない関数
(int main(void))として処理されるのでreturn(0)としているのだと
思います。

ということで、何故必要かというと、
「mainに戻り値があるとしているから必要。」
ということに成ると思います。

処理系云々の話や、規格云々はあくまでもCはこうあるべき
という枠のようなもので、実際に規格に沿ったコンパイラは
それほど多くないので、厳密にそこまでこだわる必要は
無いかもしれませんが。(とくにC99は。。。)
    • good
    • 0

>現行規格のC99またはJISCのX3010:2003ではintでなくても良くなっています。


まあ、確かにそうなんですが、それもある意味処理系依存ですので。
    • good
    • 0

>まず、返却値の型のintは省略することができません(少なくとも現行規格では)。


>その際、main関数の型は以下のどちらかにすることと決められました。

お二方、古い話を書かないでください。

現行規格のC99またはJISCのX3010:2003ではintでなくても良くなっています。
    • good
    • 0

Cが生まれたころまでさかのぼると、「シェルに返すため」であったと思います。


その後、Cがいろいろなプラットフォームに移植され、規格が整備されるにつれて、「シェルに返すため」という理由では処理系依存になってしまうため、main関数の意味についても定義しなおされることとなりました。

その際、main関数の型は以下のどちらかにすることと決められました。
int main(void);
int main(int argc, char *argv[]);
どちらの場合でも、戻り値を持つことになるので、return文は省略できないのです。

なぜ、必ず戻り値を持つように決めたのかは決めた本人に聞かないとわかりません。まあ歴史的しがらみと考えてもいいんじゃないかと思います。

なお、処理系によっては、

void main();

というmain関数を許すものもあります。しかし、これはで処理系依存になってしまいますから、あまりおすすめできる書き方ではありません。

なんとなく無駄っぽくても、
return 0;
と書いておくのが行儀のいいプログラムといえるでしょう。
    • good
    • 0

議論は禁止されているようですが、質問者さんにとっても有益だと思いますので...



> 規格で main() 関数に戻り値が必要だと決められている意図は、プログラムの呼び出し元に結果を通知するためだと私は理解しています。

必ずしもそうではありません。
main関数は再帰的に呼び出すことができますから、その場合には、返却値をどう扱うかは呼出し元の関数が決めることであって、シェルは一切関係ありません。

最初のmain関数の呼出しからの返却値に関しては、呼び出し元で使えるようにすることを想定しているのは確かです。しかし、それがシェルであるとは限りません。プログラムがシェルから呼び出されるかどうか、仮にシェルから呼び出されたとしても、終了コードを利用するかどうかは、完全に環境に依存しています。

質問者さんが環境ないしは処理系を指定していない状況であれば、特定の環境にしか適用できない回答をしても意味をなしません。
    • good
    • 0

ANo.2 氏の回答は要するに「規格で決まっているから必要」ということで、少々味気ないように感ぜられます。


規格で main() 関数に戻り値が必要だと決められている意図は、プログラムの呼び出し元に結果を通知するためだと私は理解しています。
    • good
    • 0

まず、返却値の型のintは省略することができません(少なくとも現行規格では)。



そして、return文が必要な理由ですが、返却値の型がvoidでない関数には、return文を記述するのが原則だからです。
main関数に限り、return文を記述しなければreturn 0;を記述したものとして扱われます(旧規格では異なります)。しかし、単なる書き忘れなのかどうかが分からなくなりますから、作法としてはきちんと記述する方が望ましいのです。

なお、シェル云々の話は処理系を特定しなければ意味をなしません。
    • good
    • 0

>return(0)を記入しなくてもエラーはでないのに、なぜ必要なんですか?


そのプログラムを起動したシェルに正常終了を伝えるため。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!