2014-10-06 62 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中累積額外的東西。