int fact(int x)
{
if (x == 1)
return 1;
else
return (x * fact(x-1));
}
我的问题是在函数调用期间如何在堆栈上分配变量以及x = 5
- 显然返回值为5 * fact(4)
,但是如何将5 * fact(4)
推送到堆栈上它的值将在以后解析,即可以推送简单值(非变量)并可以检索它们的值,但编译器如何处理fact(4)
。
任何人都可以解释这个递归过程究竟是由编译器实现的吗?
答案 0 :(得分:3)
在返回5 * fact(4)
之前,在新的堆栈帧上调用并计算fact(4)
fact(4)
。当对fact(5)
的调用完成时,它将返回值放在fact(1)
堆栈帧可以到达的位置(这可能是堆栈或寄存器中),并使用它来计算自己的返回值。因此,完成评估的顺序为fact(2)
,fact(4)
,...,fact(5)
,{{1}}。每个都将它们的返回值放在下一个可以检索它的位置,并用它来计算它自己的返回值。