为什么print语句在以下程序中遇到过五次?

时间:2015-04-18 10:18:01

标签: c recursion logic

根据递归的逻辑,最后printf()必须只遇到一次。 main()之后的if()应该将控件发送回开头。只有在var变为零后,我们才能到达printf()。为什么我们遇到printf()五次?我知道之前已经问过这个问题,但这个逻辑没有在那里解释。

void main()
{
    static int var=5;
    if(--var){
      main();
    }
    printf("%d\n", var);
}

3 个答案:

答案 0 :(得分:1)

printf声明不在if范围内。对main的每次(递归)调用最终会在终止前调用printf

答案 1 :(得分:1)

"最后printf()必须只遇到一次" 不正确。

您输入main()五次,因此您将退出5次。 main()的每次调用都会输入一个新的副本,为它打开一个新的堆栈帧。

当下一次调用打印了它的值并退出时,控件将在递归调用之后返回上一次调用。

答案 2 :(得分:-2)

你应该再次阅读递归的逻辑...

当仅从该函数内部调用该函数时,当前正在执行的函数及其所有参数被推入堆栈,并且新调用的函数开始执行。当这个函数调用结束时,执行返回到前一个函数(通过从堆栈中弹出),它将从它离开的位置开始执行..

现在,您可以跟踪您的程序并检查他的逻辑..