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