C 您如何解释这段代码输出中的差异?

C 您如何解释这段代码输出中的差异?,c,C,这段代码给出了意外的输出。当我注释sumdig函数的printf时,a的返回值是6,b是12,但当printf被保留时,a是5,b是6。请解释一下 main() { int a,b; a = sumdig(123); b = sumdig(123); printf("\na=%d b=%d",a,b); return 0; } int sumdig(int n) { static int s=0; int d; if(n!=0)

这段代码给出了意外的输出。当我注释sumdig函数的printf时,a的返回值是6,b是12,但当printf被保留时,a是5,b是6。请解释一下

main()
{
    int a,b;
    a = sumdig(123);
    b = sumdig(123);
    printf("\na=%d b=%d",a,b);
    return 0;
}


int sumdig(int n)
{
    static int s=0;
    int d;
    if(n!=0)
    {
        d=n%10;
        n=(n-d)/10;
        s=s+d;
        sumdig(n);
    }
    else
        return s;
    printf("\n s=%d",s);
}

如果没有显式的return语句,int c函数很容易返回上次调用的函数返回的任何值(尽管我认为实际行为尚未定义)。因此 当您打算返回对sumdig的递归调用的值时,您正在返回printf的结果


而不是
sumdig(n),尝试
返回sumdig(n)

如果没有显式的return语句,int c函数很容易返回上次调用的函数返回的任何值(尽管我认为实际行为尚未定义)。因此 当您打算返回对sumdig的递归调用的值时,您正在返回printf的结果


而不是
sumdig(n),尝试
返回sumdig(n)

好的,首先,您应该在编译时尽可能多地发出警告

这将告诉您,尽管
sumdig
返回一个值,但至少有一个代码路径不返回任何内容,因此调用者将得到垃圾


其次,您有一个静态变量,它永远不会被重新初始化,因此每次客户端调用都会在s中积累额外的内容。

对,首先,您应该使用编译器提供的尽可能多的警告来编译它

这将告诉您,尽管
sumdig
返回一个值,但至少有一个代码路径不返回任何内容,因此调用者将得到垃圾


其次,您有一个从未重新初始化的静态变量,因此每次客户端调用都会在s中累积额外的内容。

非void函数的每个路径都必须返回一个值。如果没有,我认为在C中,只有使用返回值才是UB,但谁在乎呢?不管怎样,你的编译器没有至少警告过你吗?你在这里到底称什么为意外?添加/删除
printf
的效果如何?或者,如果没有
printf
两个看似相同的调用返回不同的值,那么非void函数的每个路径都必须返回一个值。如果没有,我认为在C中,只有使用返回值才是UB,但谁在乎呢?不管怎样,你的编译器没有至少警告过你吗?你在这里到底称什么为意外?添加/删除
printf
的效果如何?或者在没有printf的情况下,两个看似相同的调用返回不同的值?