C++ 这个递归函数每次迭代的值存储在哪里?

C++ 这个递归函数每次迭代的值存储在哪里?,c++,C++,这个递归函数在return语句中是如何工作的?每次迭代的值存储在哪里?示例:val=5。当函数完成时,阶乘返回为120。我使用cout调用函数。现代CPU使用堆栈处理函数的局部变量和返回地址(这是由Algol及其后继者提示的,以便能够干净地处理递归)。每个当前执行的函数都会获得一个激活记录,其中包含本地变量(包括参数)和堆栈上分配的返回地址。您询问的值是激活记录中的值(它不仅包括您定义的变量,还包括编译器为自己的目的创建的临时值) 查看发生了什么的一种方法是让编译器编写汇编语言(甚至可以添加调试

这个递归函数在return语句中是如何工作的?每次迭代的值存储在哪里?示例:
val=5
。当函数完成时,阶乘返回为120。我使用
cout调用函数。现代CPU使用堆栈处理函数的局部变量和返回地址(这是由Algol及其后继者提示的,以便能够干净地处理递归)。每个当前执行的函数都会获得一个激活记录,其中包含本地变量(包括参数)和堆栈上分配的返回地址。您询问的值是激活记录中的值(它不仅包括您定义的变量,还包括编译器为自己的目的创建的临时值)

查看发生了什么的一种方法是让编译器编写汇编语言(甚至可以添加调试信息,它的文本可以通过给源代码提供指针来帮助破译汇编语言)。例如:

clang++-S-g factorial.cc


给出了
factorial.s

为了补充其他答案,我想在更抽象的层次上补充一点,对函数的每次调用都会在运行时堆栈上创建一个额外的激活记录。对于递归函数,每个递归调用都有多个激活记录。在您的示例中,我们希望
5,这部分运行时堆栈的一些代表性伪代码可能看起来像(从下到上):

int阶乘(int val=1){/*返回1*/}

int阶乘(int val=2){/*返回2*阶乘(1)*/}

int阶乘(int val=3){/*返回3*阶乘(2)*/}

int阶乘(int val=4){/*返回4*阶乘(3)*/}

int阶乘(int val=5){/*返回5*阶乘(4)*/}


然后,一旦到达基本情况,该过程将返回堆栈完成(在
val=1
的情况下,返回1;现在当
val=2
时,返回
2*1=2
;然后当
val=3
时,返回
3*2=6
;然后返回
4*6=24
;最后返回
5*24=120
);并且,在执行每个返回时,相应的激活记录从堆栈中弹出,直到最终答案返回到调用它的位置。

返回值存储的位置。这可能是一个CPU寄存器。阅读良好(可能回答了您的问题):在
coutesamples的情况下:注意gcc和clang中汇编的
main
函数中的
movesi,120
。这就是
阶乘(5)剩下的全部内容
。只要代码描述的行为保持不变,。这不是简单的。我以为函数正在执行第二组时间。谢谢你的帖子。
// recursive factorial function.
int factorial(int val)
{
    if (val > 1)
    {
        return (factorial(val-1) * val);//gets called 4 times
    }
    return 1;
}