main() 可以在 C 中递归调用吗?
下面的代码片段演示了在 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>
执行时,此代码会生成一系列“y”值(例如 3、6、7),每个值都来自对 main() 的后续调用.
分析编译后的程序集发现 main() 的调用方式与任何其他函数一样:
<code class="assembly">main: ... cmpl , -12(%rbp) je .L7 call main ... .L7: ... leave ret</code>
尽管标准禁止,但 g 似乎容忍此类调用。然而,这种行为并没有得到保证,程序员应该避免依赖它来确保可移植性和符合 C 标准。
以上是C 中允许递归调用'main()”吗?的详细内容。更多信息请关注PHP中文网其他相关文章!