以下是通过递归地添加数字的数字将给定数字减少为单个数字的代码。
例如,如果输入为845
,则输出为8
。 8+4+5 = 17 -> 1+7 = 8
(输出)
#include <stdio.h>
#define TRUE 1
int reduceToSingle(int numb);
int main()
{
int numb;
scanf("%d",&numb);
printf("Original = %d Single digit = %d\n", numb, reduceToSingle(numb));
return TRUE;
}
int reduceToSingle(int numb)
{
int sum = 0, digit = 0;
for (digit = numb % 10; numb != 0; numb = numb / 10)
{
digit = numb % 10;
sum += digit;
}
if (sum > 9)
reduceToSingle(sum);
else
return sum;
}
在if (sum > 9)
块中的上述代码中,我没有返回函数值。我只是调用了函数。从逻辑上讲,此函数应该给出不正确的值。但是当我在我的系统中运行上述程序时,我得到了输出中正确的数字总和。我无法理解这种行为背后的逻辑。
答案 0 :(得分:7)
这只是未定义的行为,我相信你会收到警告。 发生工作 - 调整编译器设置或完全改变编译器,它将不再存在。
在这种情况下,我怀疑eax
没有被破坏,所以你得到了预期值,即任何一个调用的最后一个值return
。因此,当您致电reduceToSingle
时,它最终会到达return
(sum <= 9
时)。从那时起,eax
的值将逐渐降低到原始调用者。
答案 1 :(得分:1)
这就是我得到的
815
Original = 815 Single digit = 2009291924
你的代码中的reduceToSingle(numb)没有在代码中返回任何值,所以它就像
printf("%d %d",12);
因此为其他格式说明符打印垃圾值