任何人都可以解释这个程序的输出

时间:2017-04-17 09:56:26

标签: c recursion

带递归函数的静态变量示例

 #include <stdio.h>
    int main()
    {
        static int i=10;
        if(--i)
        {
            main(); /*recursive call main */
            printf("%d ", ++i); /* print returned value of main */

        }
    }

3 个答案:

答案 0 :(得分:1)

static变量初始化一次。它的生命周期就是程序。由于变量初始化一次,因此初始值为10。

在每次递归调用中,它将递减(在if语句处),当达到0时,它将不会再进一步​​。

在最后一次递归之后,它将开始打印并返回。

由于printf语句在递归之后,它将在最后一次递归后开始首次打印(当i=1时)并将打印1到9。

执行printf并返回时,它会使i增加1.因此,最顶层的函数堆栈将i设为9。

答案 1 :(得分:1)

i不等于零时,函数main调用自身。

    if(--i)
    {
        main(); /*recursive call main */

所以你有一连串的电话

main( i = 10 ) -> main( i = 9 ) ->...-> main( i = 0 )

i等于零时,递归停止,每个被调用的main将控件返回到上一次main调用。

上一次调用main只执行此语句

printf("%d ", ++i); /* print returned value of main */

因此输出将是

1 2 3 4 5 6 7 8 9

答案 2 :(得分:0)

++ii = i + 1相同,所以当你写

printd("%d ", ++i);

再次递增i,使其值保持不变。