堆栈函数调用问题

tea*_*her 4 c function

我有一个名为的函数fun1(),用于递归.关于第一次打电话,我很困惑fun(--n);.它会做什么以及每个函数完成后我的堆栈如何弹出我的函数?

void fun(int n)
{
    if(n>0)
    {
        fun(--n);
        printf("%d",n);
        fun(--n);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的主要功能如下:

    int a;
    a=3;
    fun(a);
Run Code Online (Sandbox Code Playgroud)

我想知道执行的顺序以及我的堆栈在第一个函数调用之前,期间和之后包含的内容fun(--n).

pho*_*xis 7

它会打印出来 0120

                                  (3->[2]->1)
                                       +   +
                                       |   |
                          +------------+   +-------+
                          |                        |
                         ({2}->[1]->0)           ({1}->[0]->-1)
                                +   +                        +
                                |   |                        |
                 +--------------+   +----+                   |
                 |                       |                   +
                 |                       |                  (X)
                 +                       +
                ({1}->[0]->-1)          (0->X)
                       +    +
                       |    |
          +------------+    |
          |                 |
          |                 |
          +                 +
         ({0}->X)          (X)
Run Code Online (Sandbox Code Playgroud)

以上是调用树的表示.读这样的:在第一个数字( ),包在{ }是该函数接收用于一个呼叫的值,下面的箭头的下一个数字表示被一个减小的值,并用它来再次调用.将[ ]其返回打印时表示.最后一个数字( )是用于第二次调用之后的值printf.An (X)表示它无法进入if块.在每个( )大括号结束时,函数返回到它起源的点(跟随行).请注意,在第一次调用返回后,将打印该值.