exit
orを使用しなくても C の main() 関数が正しく終了できるのはなぜreturn
ですか?
例えば:
#include<stdio.h>
int sum(int a,int b)
{
return (a + b);
}
int main()
{
int a=10;
int b=5;
int ans;
ans=sum(a,b);
printf("sum is %d",ans);
}
exit
orを使用しなくても C の main() 関数が正しく終了できるのはなぜreturn
ですか?
例えば:
#include<stdio.h>
int sum(int a,int b)
{
return (a + b);
}
int main()
{
int a=10;
int b=5;
int ans;
ans=sum(a,b);
printf("sum is %d",ans);
}
これは、C99 および C11 標準で次のように規定されているためです。
5.1.2.2.3 プログラムの終了
}
関数を終了する に到達するとmain
、値 0 が返されます。戻り値の型が と互換性がない場合int
、ホスト環境に返される終了ステータスは指定されていません。
ただし、return ステートメントを追加する必要があります。これは、C89 では戻り値が定義されていないためです。
3.6.6.4 return ステートメント
}
関数を終了する に到達することは、式なしで return ステートメントを実行することと同じです。2.1.2.2 ホスト環境
メイン関数が値を指定しないリターンを実行した場合、ホスト環境に返される終了ステータスは未定義です。
コンパイラが暗黙的に追加するexit
ためです。
その理由についてナイトクラッカーをチェックしてください。それでも、意味のある戻りコードで明示的な終了/戻りを行うことを強くお勧めします。
C99 標準:
メイン関数の戻り値の型が int と互換性のある型である場合、メイン関数への最初の呼び出しからの戻りは、メイン関数によって返された値を引数として exit 関数を呼び出すことと同等です;10) } に到達するmain 関数を終了すると、値 0 が返されます。戻り値の型が int と互換性がない場合、ホスト環境に返される終了ステータスは規定されていません。
チェックする C89 テキストを探しています。
どちらも実行せずに実行が終了した場合、成功したと見なされるため、つまり 0 が返されます。
主に、フラグを使用しない場合、コンパイラは何も教えてくれません。
深刻なフラグを使用すると、コンパイラーは不足している詳細をすべて教えてくれます。
何かを返すことは重要です。開始したプログラムは、プログラムの実行が成功したかどうかを知ることができます。プログラムが何も返さない場合 (つまり、デフォルトでは 0)、たとえば、プログラムを開始した端末は、失敗したとしても完全に機能したと想定します。
コンパイラがそれを追加するからです。
Unix/Linux では、次の小さなスクリプトを試すことができます。
retval.sh
#!/bin/sh
$1
echo $?
次に、プログラムを実行します。
./retval.sh yourprogram
プログラムの戻り値を出力します。return を追加しない場合や、exit() が整数値を返す場合でも、main() が表示されます。