这段代码给出了意想不到的输出。当我评价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);
}
答案 0 :(得分:5)
如果你没有显式的return语句,int c函数很容易返回被调用的最后一个函数返回的任何值(尽管我认为实际的行为是未定义的)。因此 如果要将递归调用的值返回到sumdig,则返回printf的结果。
而不是sumdig(n);
,请尝试return sumdig(n);
答案 1 :(得分:2)
是的,首先你应该用编译器给你的警告编译它。
这会告诉你,尽管sumdig
返回一个值,但至少有一个代码路径不会返回任何内容,因此调用者会得到垃圾。
其次你有一个永远不会重新初始化的静态变量,所以每次客户调用都会在s中累积额外的东西。