C++ 递归的意外行为 #包括 使用名称空间std; 内螺纹(内螺纹x){ 如果(x==1) 返回x; 其他的 螺钉(x-1); } int main(){ cout

C++ 递归的意外行为 #包括 使用名称空间std; 内螺纹(内螺纹x){ 如果(x==1) 返回x; 其他的 螺钉(x-1); } int main(){ cout,c++,recursion,architecture,callstack,recurrence,C++,Recursion,Architecture,Callstack,Recurrence,在x86体系结构上的C/C++调用约定中,函数在eax寄存器中返回值。C中的“return val”语句使用val更新eax。如果没有显式的“return val”,则值恰好在eax寄存器中,成为函数返回值。在您的示例中,最内部的调用在返回时将1放入eax,这将被分配给所有递归调用。首先,。这是您的第一个提示出错。否则路径不会传播返回值。UB作为最终返回值丢失。我在执行此代码时没有收到任何警告。这似乎是一个可以通过调试器轻松解决的问题。非常感谢。解释得很好。这消除了我的疑问。但是您能AKE参考你

在x86体系结构上的C/C++调用约定中,函数在eax寄存器中返回值。C中的“return val”语句使用val更新eax。如果没有显式的“return val”,则值恰好在eax寄存器中,成为函数返回值。在您的示例中,最内部的调用在返回时将1放入eax,这将被分配给所有递归调用。

首先,。这是您的第一个提示出错。否则路径不会传播返回值。UB作为最终返回值丢失。我在执行此代码时没有收到任何警告。这似乎是一个可以通过调试器轻松解决的问题。非常感谢。解释得很好。这消除了我的疑问。但是您能AKE参考你的答案只是为了验证,或者我可以有一些坚实的基础来支持我的答案在未来,无论我做同一点。NELD21,请注意,这是不能保证的,即使在x86。例如,考虑这一点:在这里,编译器能够意识到其他分支包含未定义的行为。else分支无法合法执行。因此,编译器可以完全删除它。正如chris所说,它取决于编译器、优化、体系结构等,最终的汇编代码是不能保证的。@chris oh,我明白你的意思。阅读汇编代码有助于实现EAX注册。谢谢:)
#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;
}