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

时间:2014-10-06 16:17:04

标签: 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)
    {
        d=n%10;
        n=(n-d)/10;
        s=s+d;
        sumdig(n);
    }
    else
        return s;
    printf("\n s=%d",s);
}

2 个答案:

答案 0 :(得分:5)

如果你没有显式的return语句,int c函数很容易返回被调用的最后一个函数返回的任何值(尽管我认为实际的行为是未定义的)。因此 如果要将递归调用的值返回到sumdig,则返回printf的结果。

而不是sumdig(n);,请尝试return sumdig(n);

答案 1 :(得分:2)

是的,首先你应该用编译器给你的警告编译它。

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

其次你有一个永远不会重新初始化的静态变量,所以每次客户调用都会在s中累积额外的东西。