这个递归函数困惑我,发生了什么?

Fre*_*red 12 c recursion

我正在玩递归并完成这个简单的功能.我假设它会打印9-0到stdout,但是,它打印0-9.我看不出这是怎么回事.

int main()
{
        rec(10);
        return 0;
}

int rec(int n){
        if(n > 0)
                printf("%d\n", rec(n -1));
        return n;
}
Run Code Online (Sandbox Code Playgroud)

tlo*_*lin 19

rec功能上printf线之前,评估printf本身.因此,首先打印函数的最深实例.rec


Cha*_*ion 11

想想这样.

rec(10)
rec(9)
rec(8)
rec(7)
rec(6)
rec(5)
rec(4)
rec(3)
rec(2)
rec(1)
rec(0)
Run Code Online (Sandbox Code Playgroud)

开始放松

printf("%d\n", 0);
printf("%d\n", 1);
printf("%d\n", 2);
printf("%d\n", 3);
printf("%d\n", 4);
printf("%d\n", 5);
printf("%d\n", 6);
printf("%d\n", 7);
printf("%d\n", 8);
printf("%d\n", 9);
Run Code Online (Sandbox Code Playgroud)


Lie*_*yan 10

让我们像这样重写你的代码:

int rec(int n){
        if(n > 0)
        {
                int retval = rec(n -1);
                printf("%d\n", retval);
        }
        return n;
}
Run Code Online (Sandbox Code Playgroud)

它是否清楚为什么在9之前首先打印0?


小智 9

正如迈克尔·伯尔在评论中所说,如果你想看看发生了什么,请启用调试符号进行编译,如下所示:

gcc -o test -g test.c
Run Code Online (Sandbox Code Playgroud)

然后像这样运行gdb.

gdb test
Run Code Online (Sandbox Code Playgroud)

然后,为了开始,输入

start
Run Code Online (Sandbox Code Playgroud)

哪个在主函数的第一次调用时中断.类型

step
Run Code Online (Sandbox Code Playgroud)

到达代码中的下一行,然后按Enter键继续重复上一个命令.如果你很开心,请输入continue以停止踩踏.您将在每个阶段看到值和评估线,以确认上述答案.

希望能提供一些有用的信息.