2014-10-06 82 views
1

这段代码给出了意想不到的输出。当我评论sumdig函数的printf时,a的返回值是6而b是12但是当printf保留时是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); 
} 
+4

非void函数的每条路径都必须返回一个值。如果没有,我认为在C中,如果使用了返回值,那么UB只有UB,但谁在乎?无论如何,你的编译器是否至少警告过你? – Deduplicator 2014-10-06 16:22:53

+0

你究竟在这里叫什么意外?添加/删除'printf'的效果?或者,如果没有'printf'两个看起来相同的调用返回不同的值? – AnT 2014-10-06 16:29:21

回答

5

如果您还没有一个明确的return语句一个int c函数容易返回任何值被称为最后一个函数返回(虽然我认为实际的行为是不确定的)。因此, 当您要将递归调用的值返回给sumdig时,您正在返回printf的结果。

相反的sumdig(n);,尝试return sumdig(n);

2

权,首先你应该尽可能多的警告编译这是你的编译器会给你。

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

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