C 为什么在下面的程序中会遇到五次print语句?
根据递归逻辑,最后的C 为什么在下面的程序中会遇到五次print语句?,c,recursion,logic,C,Recursion,Logic,根据递归逻辑,最后的printf()只能遇到一次。if()之后的main()应将控件发送回开头。只有在var变为零后,我们才能到达printf()。为什么我们会遇到printf()五次?我知道以前有人问过这个问题,但这里没有解释这个逻辑 void main() { static int var=5; if(--var){ main(); } printf("%d\n", var); } 我想你应该再读一遍递归的逻辑 当仅从该函数内部调用该函数时,当前
printf()
只能遇到一次。if()
之后的main()
应将控件发送回开头。只有在var
变为零后,我们才能到达printf()
。为什么我们会遇到printf()
五次?我知道以前有人问过这个问题,但这里没有解释这个逻辑
void main()
{
static int var=5;
if(--var){
main();
}
printf("%d\n", var);
}
我想你应该再读一遍递归的逻辑 当仅从该函数内部调用该函数时,当前正在执行的函数及其所有参数将被推入堆栈,新调用的函数开始执行。当此函数调用结束时,执行将返回到上一个函数(通过从堆栈中弹出它),并且它将从离开的点开始执行
现在,您可以跟踪您的程序并检查其逻辑。如果
if
,则printf
语句不在中。对main
的每次(递归)调用在终止之前都将最终调用printf
。“最后的printf()
必须只遇到一次”这是不正确的
您输入main()
五次,因此您将退出它五次。每次调用main()
都会输入它的一个新副本,为它打开一个新的堆栈框架
当下一次调用打印其值并退出时,控件将在递归调用后返回到上一次调用。提示:每个递归调用在哪里完成?调用main()
是UB。方法调用不是jmp,它将返回到完成后调用它的位置。