控制if语句和函数调用的流程

时间:2017-03-25 16:38:29

标签: c if-statement recursion function-calls

我得到输出'0,1,2,0'。请有人帮我这个函数调用是如何工作的。我怀疑在递减n之后,if语句将不会执行,因为它不会大于0.因此将没有输出。但结果是别的。

#include <stdio.h>

void fun(int);

int main(void)
{
    int a=3;
    fun(a);
    return 0;
}

void fun(int n)
{
    if(n > 0)
    {
        fun(--n);
        printf("%d,", n);
        fun(--n);
    }
}

1 个答案:

答案 0 :(得分:0)

您从内部调用fun()之前的和<{em>之后的 printf()。因此,您将首先从printf 最深入调用中看到fun()

@ForceBru是绝对正确的,你可以 - 而且,如果你想成为程序员,需要能够 - 在脑海中或纸上追踪代码。这是一个例子。

第一次调用fun()时的

,同样是3. 3&gt; 0这样再次调用fun(),使用_pre_decremented值(因此n设置为2,而2传递给fun()

整个过程再次发生。 2&gt;为0 --n或1传递给fun

在第3次深度调用中,n为1.仍然大于0,因此fun(--n)再次运行,n被预先计算为0.

现在在fun()的第四次调用中,n最终为0.没有任何反应。

第三次调用,第一次fun()返回。 Rember,此fun()调用的n为1,但此时它已减少为0。打印0。然后n再次递减(到-1,它是一个带符号的int)并调用fun(-1),但由于-1 > 0为假,所以没有任何反应。第三次调用返回。

第二次调用已传递2但后来减少为1. 1打印,然后fun(--n)变为fun(0),下一次fun() invcocation is有趣(-1){{1} } fun()`返回。

最后,第一次调用and also does nothing. The second invocation of,即main中的一个,正在执行agian。它从3开始,但递减到2.打印出2。然后,fun()或1最后一次传递给--nfun()所以1>0 - 1 fun() is invoked again, and outputs fun()or 0 just like it did the first time it was passed a 1. The first invocation's recursive calls to 0,1,2,0`。

在纸上自己走一遍,因为递归函数可能会让人很困惑。我不明白为什么你自己得到了这个输出,直到我完成代码,并且我已经在c中编程了20年!