2

具有递归函数的静态变量示例

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

        }
    }
4

3 回答 3

2

虽然i不等于零,但函数 main 调用自身。

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

所以你有一连串的电话

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

i等于 0 时,递归停止,每个被调用的 main 将控制权返回给前一个 main 调用。

之前的main调用只是执行了这条语句

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

因此输出将是

1 2 3 4 5 6 7 8 9
于 2017-04-17T10:10:55.517 回答
1

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

在每次递归调用中,它都会递减(atif语句),当达到 0 时,它不会进一步递归。

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

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

在执行printf和返回时,它会不断增加i1。因此,最顶层的函数堆栈将变为i9。

于 2017-04-17T10:07:41.700 回答
1

++ii = i + 1和你写的时候一样

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

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

于 2017-04-17T10:06:47.970 回答