既存のすべての回答が未定義の動作であると言っているため回答しますが、これは真実ではないため、賛成できるものは何もありません。
C89 (ドラフト標準への参照について pmg に感謝)、5.1.2.2.3:
main 関数への最初の呼び出しから戻ることは、main 関数によって返された値を引数として exit 関数を呼び出すことと同じです。メイン関数を終了する } に達した場合、ホスト環境に返される終了ステータスは不定です。
C99 では、n1256、5.1.2.2.3 から引用:
メイン関数の戻り値の型が int と互換性のある型である場合、メイン関数への最初の呼び出しからの戻りは、メイン関数によって返された値を引数として exit 関数を呼び出すことと同じです。メイン関数を終了する } に到達すると、値 0 が返されます。戻り値の型が int と互換性がない場合、ホスト環境に返される終了ステータスは規定されていません。
つまり、「未定義の動作」でmain
はありません。関数が返されるかのように動作しますが、C89 では、返される値は標準で指定されていません。サンプル プログラムの場合、実装では、返される値は一貫して 12 のように見えます。これは、おそらく Ben Voigt が言っている理由によると思われます。あなたは Linux を使っているので、コードを C99 としてコンパイルすること (またはとにかく、gcc のほぼ準拠の C99 モードを使用してコンパイルすること) はおそらく大きな変更ではありません。
以外の値を返す関数のmain
場合、呼び出し元が戻り値を使用しない限り、未定義の動作です(n1256、6.9.1/12):
関数を終了する } に到達し、関数呼び出しの値が呼び出し元によって使用された場合、動作は未定義です。
main
への最初の呼び出しが、この一般規則から除外されていると言及されるべきかどうかはわかりません。である必要はありません: 標準の POV からすると、その呼び出しには呼び出し元が存在しないため、関数呼び出しの値は、終了状態になるにもかかわらず、「呼び出し元によって使用される」ことはないと思います。プログラムのために。