繁体   English   中英

谁能向我解释这个输出?

[英]Can anyone explain this output to me?

因此,我在进行一些思想实验,我想象两个函数相互递归时会发生什么。 如果两个函数都可能陷入无限循环,那将是一个这样的例子。

为此,我想到了一个简单的示例:

#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。

我没想到它实际上会“优化”该调用,而完全忽略了将“值是”打印到标准输入中。

编辑:我使用GCC 4.5.0在Cygwin下将其编译为g ++ source.cpp(-O1 / 2/3)。 -OX版本实际上无限循环而不会导致堆栈溢出。

由于您未指定要使用的C ++,因此我将给出C ++ 0x答案:

实际上, 这是 C ++ 0x中未定义的行为

如果您使用的是C ++ 03,我无法完全解释其行为,但是由于您的堆栈最终将溢出,因此您仍然处在与实现相关的行为的范围之内。 期望这里发生任何理智的事情都是傻子的事。

数学观点来看, f(x)= b(x +1)b(x)= f(x-1)不足以定义fb 一个可能的解决方案是f(x)= xb(x)= x-1 ,而另一个解决方案是f(x)= 0g(x)= 0 (并且还有更多种方法)。 因此,从数学上讲,该函数应返回什么的问题没有答案。 计算的角度来看,情况甚至更糟,因为毕竟您没有定义数学函数,而是要指定如何执行计算。 foo(x - 1)意思是“当我们将x - 1的值作为参数传递时,执行在foo()函数中指定的计算”,并且类似地对于bar(x + 1) 因此,当每个函数无条件地说要调用另一个函数时,您已指定希望进行无限递归。 正如其他人提到的那样,某些语言(或语言版本)将此视为良好定义的情况(期望的结果是程序挂起),而另一些语言则将其视为未定义的情况(即,编译器可能会做任何喜欢的事情)。

由于递归没有停止条件,因此自然会陷入无限循环。 您假设这些函数返回“ just x”是错误的。 他们注定永远不会回来。

编译器不能仅仅优化递归。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM