7

以下是通过递归添加数字的数字来将给定数字减少到单个数字的代码。

例如,如果输入是845输出88+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)块中,我没有返回函数值。我只是调用了该函数。从逻辑上讲,这个函数应该给出一个不正确的值。但是当我在我的系统中运行上述程序时,我得到了正确的输出数字总和。我无法理解这种行为背后的逻辑。

4

2 回答 2

7

这只是未定义的行为,我相信您会收到警告。它碰巧起作用了-调整编译器设置或完全更改编译器,但它不再起作用了。

在这种情况下,我怀疑eax没有被破坏,所以你得到了预期值,即return任何调用的最后一个值。所以当你打电话时reduceToSingle,它最终会到达return(当sum <= 9)。从那时起, 的值eax将逐渐下降到原始调用者。

于 2012-07-24T11:21:22.847 回答
1

这就是我得到的

815
Original = 815 Single digit = 2009291924

在您的代码中 reduceToSingle(numb) 没有返回代码中的任何值,所以它类似于

printf("%d %d",12);

因此为其他格式说明符打印一个垃圾值

于 2012-07-24T11:26:55.133 回答