递归控制流程
Recursion Control flow
#include<stdio.h>
void printd(int n)
{
if(n/10)
printd(n/10);
putchar(n%10+'0');
}
在上面的代码中,将 n 视为正整数
它的值为 123.
第一次,123被传递给printd(first printd)
第二次,12传给了printd(second printd)
第三次,1被传递给printd(第三次printd),putchar打印1
那么控制流到第二个printd后,n的值是多少?
因为它是一个自动变量,一旦函数结束,它在第三个 printd 中的值 1 就会消失,并在第二个 printd 中获得 12 的值。
如果是这样,第二个 printd 将再次导致第三个 printd 等等....
但是程序漂亮地打印了 123。
我在函数调用过程中对控制流和变量值的理解哪里出错了?
仅供参考,该程序来自 K&R 第 4.10 节递归
你错了:
If so,second printd will again lead to third printd
second printd
从它停止的地方开始,而不是从函数 printd
的开始。因此,putchar
在第二个 printd
中执行,打印 2 并且在第一个 printd
中发生同样的事情,打印 3.
#include<stdio.h>
void printd(int n)
{
if(n/10)
printd(n/10);
putchar(n%10+'0');
}
在上面的代码中,将 n 视为正整数 它的值为 123.
第一次,123被传递给printd(first printd) 第二次,12传给了printd(second printd) 第三次,1被传递给printd(第三次printd),putchar打印1
那么控制流到第二个printd后,n的值是多少? 因为它是一个自动变量,一旦函数结束,它在第三个 printd 中的值 1 就会消失,并在第二个 printd 中获得 12 的值。
如果是这样,第二个 printd 将再次导致第三个 printd 等等....
但是程序漂亮地打印了 123。
我在函数调用过程中对控制流和变量值的理解哪里出错了?
仅供参考,该程序来自 K&R 第 4.10 节递归
你错了:
If so,second printd will again lead to third printd
second printd
从它停止的地方开始,而不是从函数 printd
的开始。因此,putchar
在第二个 printd
中执行,打印 2 并且在第一个 printd
中发生同样的事情,打印 3.