C で main() を再帰的に呼び出すことはできますか?
以下のコード スニペットは、C で main() を再帰的に呼び出す興味深い動作を示しています。 .
<code class="cpp">#include <iostream> #include <cstdlib> int main() { std::cout << "!!!Hello World!!!" << std::endl; system("pause"); return main(); }</code>
コードは正常にコンパイルされ、実行すると「Hello World!!!」と表示されます。無期限に。ただし、この動作は C の標準に準拠していないことに注意することが重要です。 C 標準では、main() を再帰的に呼び出したり、そのアドレスを取得したりすることを明示的に禁止しています。
しかし、実際には、Linux g コンパイラなどの一部のコンパイラでは、main() 内での main() の呼び出しが許可されています。この寛容性は、次のコードで明らかです:
<code class="cpp">#include <cstdlib> #include <iostream> using namespace std; int main() { int y = rand() % 10; cout << "y = " << y << endl; return (y == 7) ? 0 : main(); }</code>
このコードが実行されると、それぞれの後続の main() 呼び出しから一連の "y" 値 (例: 3、6、7) が生成されます。 .
コンパイルされたアセンブリを分析すると、main() が他の関数と同じように呼び出されていることがわかります。
<code class="assembly">main: ... cmpl , -12(%rbp) je .L7 call main ... .L7: ... leave ret</code>
標準では禁止されているにもかかわらず、g はそのような呼び出しを許容しているようです。ただし、この動作は保証されていないため、プログラマは移植性と C 標準への準拠を確保するためにこの動作に依存しないようにする必要があります。
以上がC で `main()` を再帰的に呼び出すことは許可されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。