所以我在玩一些思想实验,我想象当两个函数相互递归时会发生什么。如果这两个函数都可能陷入无限循环,其中之一就是这样。
为此,我想到了这个简单的例子:
#include <iostream>
#include <cstdlib>
int foo(int x);
int bar(int x);
int foo(int x)
{
return bar(x + 1);
}
int bar(int x)
{
return foo(x - 1);
}
int main(int argc, char **argv)
{
if (argc > 1)
std::cout << "The value is: " << foo(atoi(argv[1])) << std::endl;
return 0;
}
有趣的是,如果你用 g++ 编译它,它实际上不会打印出任何东西。使用任何 -O 开关编译它,它就会陷入无限循环。
想法?这可能是编译器错误,还是可以预料到的?我认为在 -O 优化的情况下,它会意识到 foo(x) 和 bar(x) 只返回 x。
我没想到它实际上会“优化”调用并完全忽略将“值是”打印到标准输入。
编辑:我在 Cygwin 下使用 GCC 4.5.0 将它编译为 g++ source.cpp (-O1/2/3)。-OX 版本实际上无限循环而没有堆栈溢出。