No.9ベストアンサー
- 回答日時:
> >まず、返却値の型のintは省略することができません(少なくとも現行規格では)。
> お二方、古い話を書かないでください。
> 現行規格のC99またはJISCのX3010:2003ではintでなくても良くなっています。
それはmain関数が処理系定義の形式でも構わないということであって、返却値の型であるintという記述を省略してよいかどうかとは、まったく別の話です。
> 処理系云々の話や、規格云々はあくまでもCはこうあるべき
> という枠のようなもので、実際に規格に沿ったコンパイラは
> それほど多くないので、厳密にそこまでこだわる必要は
> 無いかもしれませんが。(とくにC99は。。。)
私もこの意見には賛成です。
だからこそ、自分が使っている、あるいは対象としている処理系が何であるかを明確にする必要があります。
回答ありがとうございます。
質問する前にもう少しC言語に対して勉強するべきだったと
反省しています。親切に回答していただいたのに、勉強不足
で申し訳ありませんでした。
回答なんですが、return0;が無いと明確さに欠けるので、
記述したほうがいいということですよね。
見やすく明確に!ですね。
分からないことがあるときはまた質問させていただきます。
ありがとうございました!!
No.8
- 回答日時:
昔のCでは関数に戻り値型を書かない場合int型となります。
同じように引数を書かないと無しと見なされます。
エラーがでるか警告が出るか何もでないかは、
処理系の設定や処理系そのものに依存すると思いますが
少なくともmain()はこの場合だとint型を返す引数を取らない関数
(int main(void))として処理されるのでreturn(0)としているのだと
思います。
ということで、何故必要かというと、
「mainに戻り値があるとしているから必要。」
ということに成ると思います。
処理系云々の話や、規格云々はあくまでもCはこうあるべき
という枠のようなもので、実際に規格に沿ったコンパイラは
それほど多くないので、厳密にそこまでこだわる必要は
無いかもしれませんが。(とくにC99は。。。)
No.6
- 回答日時:
>まず、返却値の型のintは省略することができません(少なくとも現行規格では)。
>その際、main関数の型は以下のどちらかにすることと決められました。
お二方、古い話を書かないでください。
現行規格のC99またはJISCのX3010:2003ではintでなくても良くなっています。
No.5
- 回答日時:
Cが生まれたころまでさかのぼると、「シェルに返すため」であったと思います。
その後、Cがいろいろなプラットフォームに移植され、規格が整備されるにつれて、「シェルに返すため」という理由では処理系依存になってしまうため、main関数の意味についても定義しなおされることとなりました。
その際、main関数の型は以下のどちらかにすることと決められました。
int main(void);
int main(int argc, char *argv[]);
どちらの場合でも、戻り値を持つことになるので、return文は省略できないのです。
なぜ、必ず戻り値を持つように決めたのかは決めた本人に聞かないとわかりません。まあ歴史的しがらみと考えてもいいんじゃないかと思います。
なお、処理系によっては、
void main();
というmain関数を許すものもあります。しかし、これはで処理系依存になってしまいますから、あまりおすすめできる書き方ではありません。
なんとなく無駄っぽくても、
return 0;
と書いておくのが行儀のいいプログラムといえるでしょう。
No.4
- 回答日時:
議論は禁止されているようですが、質問者さんにとっても有益だと思いますので...
> 規格で main() 関数に戻り値が必要だと決められている意図は、プログラムの呼び出し元に結果を通知するためだと私は理解しています。
必ずしもそうではありません。
main関数は再帰的に呼び出すことができますから、その場合には、返却値をどう扱うかは呼出し元の関数が決めることであって、シェルは一切関係ありません。
最初のmain関数の呼出しからの返却値に関しては、呼び出し元で使えるようにすることを想定しているのは確かです。しかし、それがシェルであるとは限りません。プログラムがシェルから呼び出されるかどうか、仮にシェルから呼び出されたとしても、終了コードを利用するかどうかは、完全に環境に依存しています。
質問者さんが環境ないしは処理系を指定していない状況であれば、特定の環境にしか適用できない回答をしても意味をなしません。
No.3
- 回答日時:
ANo.2 氏の回答は要するに「規格で決まっているから必要」ということで、少々味気ないように感ぜられます。
規格で main() 関数に戻り値が必要だと決められている意図は、プログラムの呼び出し元に結果を通知するためだと私は理解しています。
No.2
- 回答日時:
まず、返却値の型のintは省略することができません(少なくとも現行規格では)。
そして、return文が必要な理由ですが、返却値の型がvoidでない関数には、return文を記述するのが原則だからです。
main関数に限り、return文を記述しなければreturn 0;を記述したものとして扱われます(旧規格では異なります)。しかし、単なる書き忘れなのかどうかが分からなくなりますから、作法としてはきちんと記述する方が望ましいのです。
なお、シェル云々の話は処理系を特定しなければ意味をなしません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
C++のfor文について
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
typedef enumの使い方を教えて...
-
C++でboolにintの値を代入する...
-
inline
-
相互参照するクラス、俺こんな...
-
間違っていないような気がする...
-
C言語のコンパイルエラー
-
main.c:7:43: warning: implici...
-
構造体の要素すべてに対する四...
-
enumについて
-
visualstudio C# テキストボッ...
-
WM_NOTIFYのメッセージクラッカー
-
識別子が定義されていませんと...
-
引数の受け渡し
-
DDVによるメッセージの変更
-
戻り値の型??
-
C++のコンストラクタを宣言する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
typedef enumの使い方を教えて...
-
main.c:7:43: warning: implici...
-
C++でboolにintの値を代入する...
-
構造体の要素すべてに対する四...
-
intとINTの違いは?
-
ハンドルされていない例外が発...
-
DDVによるメッセージの変更
-
変数の型を定義しなかった場合...
-
【#define】 defineで定義した...
-
C++ クラスをメンバにもつクラ...
-
構造体の宣言でエラーが出ます。
-
プログラムの中で別のmainを呼...
-
void func( void )について
-
エラー「invalid conversion fr...
-
関数の実体定義にヘッダファイ...
おすすめ情報