c - 为什么我得到正确的输出,即使代码在逻辑上是不正确的

标签 c

以下是通过递归地添加数字的数字将给定数字减少为一位数的代码。

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

最佳答案

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

在这种情况下,我怀疑 eax没有被破坏所以你得到期望值,即最后一个值 return由任何电话编辑。所以当你调用reduceToSingle ,最终会达到return (当 sum <= 9 时)。从此值eax将滴入原始调用者。

关于c - 为什么我得到正确的输出,即使代码在逻辑上是不正确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11629740/

相关文章:

c - 如何根据它们的差异是否最接近给定数字来选择两个数字?

c++ - 如何解决由于将 .lib 文件添加到 Visual Studio 中的 C++ 项目而导致的链接错误?

c++ - 无符号与有符号整数的性能

c - 如何扫描 C 中的数组部分寻找匹配用户输入

c# - 互操作 C++ 时释放分配的内存

c - 为什么可执行和可链接格式(ELF)文件包含一组部分?

c - C 中隐式转换为 double

c - 不寻常的函数指针参数语法

c - c 中的网格和指针

c - 功能类似于数组中的东西