C で Main 関数を再帰的に呼び出す
提供されたコード スニペットは、 C 内で main() 関数を再帰的に呼び出そうとします。ただし、この動作は厳密な C 準拠では許可されていないことに注意することが重要です。
C では main() の再帰呼び出しは許可されていますか?
C 標準に従って、 main() 関数を含め、関数はそれ自体を直接呼び出すことはできません。この制限は、無限再帰を防止し、プログラムの終了を保証することを目的としています。
g を使用した実際の実装
言語標準にもかかわらず、実際には main() を再帰的に呼び出すことが可能です。 GNU C コンパイラを使用します (g )。 g はこの点に関して標準を厳密に強制するものではなく、再帰的な main() 呼び出しを含むコードのコンパイルと実行を許可します。
サンプル コード
次の変更されたコード スニペットg を使用した再帰 main() 呼び出しを示します:
<code class="cpp">#include <cstdlib> #include <iostream> using namespace std; int main() { int y = rand() % 10; // returns 3, then 6, then 7 cout << "y = " << y << endl; return (y == 7) ? 0 : main(); }</code>
このコードをコンパイルして実行すると、次の出力が生成されます:
y = 3 y = 6 y = 7
アセンブリ分析
このコード用に生成されたアセンブリを調べると、g が再帰的な main() 呼び出しを他の関数呼び出しと同じように扱っていることがわかります。
main: ... cmpl , -12(%rbp) je .L7 call main ... .L7: ... leave ret
注:
この動作は g で可能ですが、保証されていないことに注意することが重要です。他のコンパイラは C 標準に厳密に従っており、コンパイル エラーや予期しない動作が発生する場合があります。したがって、再帰的な main() 呼び出しの使用は推奨されません。
以上がC では `main()` を再帰的に呼び出すことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。