我认为这个程序的输出是4321.即modulo 1234 = 4,然后除以10得到123,所以modulo 123 = 3 ...当完成时应该是4321.但输出是1234。有人可以解释一下这是怎么回事吗?非常感谢和节日快乐。
void printnumber(int n) { //function declaration
if (n < 0) {
putchar('-');
printnumber(-n); //recursive call
} else {
if (n >= 10) {
printnumber(n / 10); //second recursive call
}
putchar('0' + (n % 10));
}
}
int main() {
int n = 1234;
printnumber(n);
putchar('\n');
return 0;
}
答案 0 :(得分:2)
First call to function, input 1234
Second call to fucntion, input 123
Third call to function, input 12
Fourth call to function, input 1
print 1 and return
print 2 and return
print 3 and return
print 4 and return
Output: 1234
答案 1 :(得分:1)
原因是因为首先调用的函数将打印最后的,即语句
putchar('0' + (n % 10));
当n
变得小于10
时,将首次执行,这将打印1
然后2
然后3
,然后4
}。
printnumber(1234) --> printnumber(123) --> printnumber(12) --> putchar('0' + (1 % 10))
|
V
putchar('0' + (1234 % 10)) <-- putchar('0' + (123 % 10)) <-- putchar('0' + (12 % 10))
答案 2 :(得分:1)
原因是您在递归调用后打印。
因此,对于您的示例,它会将以下值(按顺序)传递给您的printnumber
函数。
然后,重新开始工作,只打印传入值的最后一位数字。
要更正此问题,请将putchar
行移至递归之前。
答案 3 :(得分:1)
我知道你的问题是什么,请按照这个想法。
通话功能;
1234大于10,所以让我们重复一下这个功能。
在重复该函数直到结束之前,不会执行if语句。
答案 4 :(得分:0)
你的函数在打印字符之前递归调用,而不是之后。让我们使用您的1234
。
首先,我们调用函数printnumber(1234)
。在此函数中,我们会立即转到else
块,该块会调用printnumber(123)
,而printnumber(12)
会调用printnumber(1)
,调用printnumber(1)
。最后,else
进入>= 10
块,但它不是1
,因此它只打印printnumber(12)
并退出,返回2
,现在打印{{1}},等等。
此外,这正是调试器(例如gdb)的用途。