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,它将返回到完成后调用它的位置。