web-dev-qa-db-ja.com

int main()関数はすべてのコンパイラで値を返す必要がありますか?

C++用の一部のコンパイラでintmain()を使用しているときに、returnステートメントを含める必要がないのはなぜですか? Turbo C++はどうですか?

20
ajarmani

C++、およびC99とC11では、制御フローがmain関数の終わりに達した場合、関数implicltyが0を返すことが言語の特別な規則です。

41
Kerrek SB

C++およびC99/C11では、main関数にreturnステートメントがない場合、デフォルトで0が返されます。

§3.6.1主な機能

Mainのreturnステートメントには、main関数を終了し(自動保存期間を持つオブジェクトを破棄し)、引数として戻り値を指定してstd :: exitを呼び出す効果があります。制御がreturnステートメントに遭遇せずにmainの終わりに達した場合、その効果はreturn0を実行することです。

wikiページも読んでください C/C++メイン関数

戻り値がプログラマーによって定義されていない場合、暗黙的に0を返します。 main()関数の最後に、コンパイラーによって挿入されます。この動作は、C++標準で必要です。

26
billz

mainintを返す必要があります。TurboC++を含む一部のコンパイラは、他の戻り値、特にvoid mainを許可する場合がありますが、間違っています。絶対に使用しないでください。

ただし、C++では、mainに値を明示的に返さない場合、それはreturn 0;と同じです。

C++11§3.6.1主な機能セクション5

Mainのreturnステートメントには、main関数を終了し(自動保存期間を持つオブジェクトを破棄し)、引数として戻り値を指定してstd :: exitを呼び出す効果があります。制御がreturnステートメントに遭遇せずにmainの終わりに達した場合、その効果は実行の効果です。

return 0;

Cの場合、これはC99以降でのみサポートされ、C89ではサポートされないことに注意してください。

13
Yu Hao

標準では、mainステートメントがない場合、return0を返すとされています。 ドラフトC++標準 セクション3.6.1段落5から:

mainのreturnステートメントには、main関数を終了し(自動保存期間を持つオブジェクトを破棄し)、引数として戻り値を指定してstd :: exitを呼び出す効果があります。 returnステートメントに遭遇せずに制御がmainの終わりに達した場合、その効果は実行の効果です

   return 0;

セクションC995.1.2.2.3ドラフト標準は次のように述べています。

Main関数の戻り値の型がintと互換性のある型である場合、main関数への最初の呼び出しからの戻り値は、main関数によって返された値を引数としてexit関数を呼び出すことと同じです; 10)メイン関数を終了する}に到達すると、値0が返されます。

私が知ることができることから、 Turbo C++ の最後のバージョンはかなり古く、サポートされている標準がある場合、それを定義するものは何も見つかりません。

4
Shafik Yaghmour

任意の言語標準に準拠する以外に、main関数の終了時に値を返す説得力のある理由はありません。

これは、一般的なオペレーティングシステムのプロセスに、終了したプロセスのリターンコードの概念があるためです。値を返す必要のないオペレーティングシステムを想像するのは難しいことではありません。また、オーバーライドされない限り、すべてのプロセスによって0が暗黙的に返される世界を想像することもできます。その場合、戻りコードの決定をシステムコールに委任できます。 (実際、このようなシステムコールは、Cのexit関数の形式ですでに存在しています)。

0
Tac-Tics

他の人が述べているように、一部のコンパイラでは明示的にreturn 0;する必要はありませんが、(可能であれば)常にそうすることをお勧めします。 main関数から戻ることを許可しないコンパイラの使用はお勧めしません。

Int mainからの戻り値は非常に重要であり、実際に使用されていることに注意してください。

Mainからの戻り値は、プログラムからのexit statusまたはerror codeと呼ばれることもあり、ゼロはプログラムが正常に完了したことを示します。他のプログラムやスクリプトはこのコードにアクセスして、プログラムが正常に完了したかどうかを判断できます。

詳細はこちら: http://en.wikipedia.org/wiki/Exit_status

0
Tyzoid

明示的に指定したかどうかに関係なく、TCはEXIT_SUCCESSを返します

0
MG.