这是一个基本的递归调用。
首先,请注意,对于n
小于 50 的值,您的函数将打印n
两次,而对于其他值,n
它将仅打印一次。这与你的输出一致,所以这里唯一要弄清楚的是顺序......
第二个注意, for 的输出n*2
应该位于n
(for )的第一行和第二行输出之间,因为您在两个s之间n < 50
进行递归调用。好吧,这也与您的输出一致。printf
这正如预期的那样。
您在互联网上找到的有关堆栈的部分是指调用堆栈。为了从函数返回,程序必须跟踪调用函数时的位置。此信息被写入称为“调用堆栈”或“执行堆栈”的内存特殊部分的“末尾”;并且它从堆栈中取出(意味着当函数返回时移动'end')。调用参数也记录在堆栈上。
这种堆叠对于递归是必不可少的。
因此,当您调用newfunc(2)
程序时记录它在第 5 行,然后跳转到第newfunc
8 行的开头。堆栈看起来(理论上)如下所示:
line 5, n=2
当它到达第 13 行时,它再次调用新函数,使堆栈
line 5, n=2; line 13, n=4
这持续了好几次,直到堆栈看起来像
line 5, n=2; line 13, n=4; line 13, n=8; line 13, n=16; line 13, n=32; line 13, n=64
当 if 失败并newfunc
返回时,在第 13 行之后弹出堆栈并恢复执行(因为这是我们从堆栈中得到的)
line 5, n=2; line 13, n=4; line 13, n=8; line 13, n=16; line 13, n=32
当我们运行printf
并弹出堆栈时,我们返回到第 13 行(我们弹出时得到的,对 >),因此堆栈是
line 5, n=2; line 13, n=4; line 13, n=8; line 13, n=16;
等等,而它展开整个调用堆栈。
一些最后的细节:堆栈在概念上“向上”增长,所以我们经常把它写成
line 13, n=32
line 13, n=16
line 13, n=8
line 13, n=4
line 5, n=2
堆栈内容的确切格式取决于芯片的体系结构和操作系统程序员做出的一些决定。
顺便说一句--ac 程序通常不使用行号来表示“位置”,这是因为行在 c 中不是很好的度量(如果我够傻的话,我可以将整个程序写成一行),而是使用值芯片上的寄存器,但这并不真正影响这里的解释。