【问题标题】:Unexpected behavior of recursion递归的意外行为
【发布时间】:2023-07-10 04:12:02
【问题描述】:
#include <iostream>
using namespace std;
int screw(int x){
    if(x==1) 
       return x;
    else 
       screw(x-1);
}
int main(){
    cout<<screw(5)<< endl; 
    return 0;
}

此代码的输出:1 当他们的代码的“else”部分没有返回语句时,任何人都可以解释螺丝(5),螺丝(4),螺丝(3),螺丝(2)如何返回1。 使用调用堆栈来解释将不胜感激。非常欢迎任何与它相关的基础知识的见解。

【问题讨论】:

标签: c++ recursion architecture callstack recurrence


【解决方案1】:

在 x86 架构上的 C/C++ 调用约定中,函数在 eax 寄存器中返回值。 C 中的“return val”语句用 val 更新 eax。如果没有明确的'return val',则恰好在 eax 寄存器中的值成为函数返回值。在您的示例中,最里面的调用在返回时将 1 放入 eax 中,这会传播到所有递归调用。

【讨论】:

  • 非常感谢。解释得很漂亮。它消除了我的疑虑。但是,您能否仅出于身份验证的目的为您的答案提供参考,或者我可以在将来有一些坚实的基础来支持我的答案,无论我提出同样的观点。
  • @nerd21,请注意,这并不能保证,即使在 x86 上也是如此。例如,考虑一下:godbolt.org/g/XnbIVR。在这里,编译器能够意识到 else 分支包含未定义的行为。因此,else 分支不能合法执行。因此,编译器可以将其完全删除。
  • 正如 chris 所说,取决于编译器、优化、架构等,最终的汇编代码无法保证。
  • @chris 哦,我明白了。并且阅读相同的汇编代码有助于实现 EAX 注册的东西。谢谢:)
最近更新 更多