C++用の一部のコンパイラでintmain()を使用しているときに、returnステートメントを含める必要がないのはなぜですか? Turbo C++はどうですか?
C++、およびC99とC11では、制御フローがmain
関数の終わりに達した場合、関数implicltyが0
を返すことが言語の特別な規則です。
C++およびC99/C11では、main関数にreturnステートメントがない場合、デフォルトで0が返されます。
§3.6.1主な機能
Mainのreturnステートメントには、main関数を終了し(自動保存期間を持つオブジェクトを破棄し)、引数として戻り値を指定してstd :: exitを呼び出す効果があります。制御がreturnステートメントに遭遇せずにmainの終わりに達した場合、その効果はreturn0を実行することです。
wikiページも読んでください C/C++メイン関数
戻り値がプログラマーによって定義されていない場合、暗黙的に0を返します。 main()関数の最後に、コンパイラーによって挿入されます。この動作は、C++標準で必要です。
main
はint
を返す必要があります。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ではサポートされないことに注意してください。
標準では、main
ステートメントがない場合、return
は0
を返すとされています。 ドラフトC++標準 セクション3.6.1
段落5
から:
mainのreturnステートメントには、main関数を終了し(自動保存期間を持つオブジェクトを破棄し)、引数として戻り値を指定してstd :: exitを呼び出す効果があります。 returnステートメントに遭遇せずに制御がmainの終わりに達した場合、その効果は実行の効果です
return 0;
セクションC99
の5.1.2.2.3
ドラフト標準は次のように述べています。
Main関数の戻り値の型がintと互換性のある型である場合、main関数への最初の呼び出しからの戻り値は、main関数によって返された値を引数としてexit関数を呼び出すことと同じです; 10)メイン関数を終了する}に到達すると、値0が返されます。
私が知ることができることから、 Turbo C++ の最後のバージョンはかなり古く、サポートされている標準がある場合、それを定義するものは何も見つかりません。
任意の言語標準に準拠する以外に、main関数の終了時に値を返す説得力のある理由はありません。
これは、一般的なオペレーティングシステムのプロセスに、終了したプロセスのリターンコードの概念があるためです。値を返す必要のないオペレーティングシステムを想像するのは難しいことではありません。また、オーバーライドされない限り、すべてのプロセスによって0が暗黙的に返される世界を想像することもできます。その場合、戻りコードの決定をシステムコールに委任できます。 (実際、このようなシステムコールは、Cのexit関数の形式ですでに存在しています)。
他の人が述べているように、一部のコンパイラでは明示的にreturn 0;
する必要はありませんが、(可能であれば)常にそうすることをお勧めします。 main関数から戻ることを許可しないコンパイラの使用はお勧めしません。
Int mainからの戻り値は非常に重要であり、実際に使用されていることに注意してください。
Mainからの戻り値は、プログラムからのexit status
またはerror code
と呼ばれることもあり、ゼロはプログラムが正常に完了したことを示します。他のプログラムやスクリプトはこのコードにアクセスして、プログラムが正常に完了したかどうかを判断できます。
明示的に指定したかどうかに関係なく、TCはEXIT_SUCCESSを返します