首页 >后端开发 >C++ >C 中允许递归调用'main()”吗?

C 中允许递归调用'main()”吗?

Linda Hamilton
Linda Hamilton原创
2024-11-01 07:03:01645浏览

Is Recursively Calling `main()` in C   Allowed?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn