GNU/Linux >> Linux の 問題 >  >> Linux

returnステートメントのないメイン関数が値12を返すのはなぜですか?

既存のすべての回答が未定義の動作であると言っているため回答しますが、これは真実ではないため、賛成できるものは何もありません.

C89 (ドラフト標準への参照について pmg に感謝)、5.1.2.2.3:

<ブロック引用>

main 関数への最初の呼び出しから戻ることは、main 関数によって返された値を引数として exit 関数を呼び出すことと同じです。メイン関数を終了する } に達した場合、ホスト環境に返される終了ステータスは未規定です。

C99 では、n1256、5.1.2.2.3 から引用:

<ブロック引用>

main 関数の戻り値の型が int 内で互換性のある型である場合、main 関数への最初の呼び出しからの戻りは、main 関数によって返された値を引数として exit 関数を呼び出すことと同じです。メイン関数を終了する } に到達すると、値 0 が返されます。戻り値の型が int と互換性がない場合、ホスト環境に返される終了ステータスは指定されていません。

したがって、これは「未定義の動作」ではありません:main のように動作します。 関数は戻りますが、C89 では戻り値は標準で指定されていません。サンプル プログラムの場合、実装では、返される値は一貫して 12 のように見えます。これは、おそらく Ben Voigt が言っている理由によると思われます。あなたは Linux を使っているので、コードを C99 としてコンパイルする (あるいは、gcc のほぼ準拠の C99 モードを使用してコンパイルする) ことは、おそらく大きな変更ではありません。

main 以外の値を返す関数の場合 、それはです 未定義の動作、例外 呼び出し元は戻り値を使用しません (n1256、6.9.1/12):

<ブロック引用>

関数を終了する } に到達し、関数呼び出しの値が呼び出し元によって使用された場合、動作は未定義です。

main への最初の呼び出しが は、この一般規則から除外されるものとして言及する必要があります。である必要はありません:標準の POV からすると、その呼び出しには呼び出し元が存在しないため、関数呼び出しの値は、終了状態になるにもかかわらず、「呼び出し元によって使用される」ことはないと思います。プログラムのために。


swegi が言うように、これは未定義の動作です。 Steve Jessop らが言うように、C89 までは未規定値であり、C99 で規定されています (観察された動作は C99 に準拠していません)

ほとんどの環境で実際に起こることは、最後の printf からの戻り値が 戻り値に使用されるレジスタに残されます。

したがって、n ==0 の場合は 11、n が 1 桁の場合は 12、2 桁の n の場合は 14、3 桁の n の場合は 16 などになります。


Linux
  1. [a-z]がBashの小文字と一致するのはなぜですか?

  2. sudoがエイリアスを無視するのはなぜですか?

  3. 出口値を失うことなくTsを使用しますか?

  1. $なしの変数展開が式で機能するのはなぜですか?

  2. 「chmod -R 755」はどのように機能しますか

  3. malloc(0) は何を返しますか?

  1. RDTSC を使用して CPU サイクルを取得する - RDTSC の値が常に増加するのはなぜですか?

  2. Linux カーネルにはメイン機能がありますか?

  3. 以下で宣言された呼び出し関数