2013-10-15 145 views
0

您好我已經在Visual C++中實現了一個C代碼,並對其進行了一些修改以進行調試。這是預期的最終輸出(階乘的值)來的代碼輸出的解釋

long long unsigned factorial(long long unsigned int * n) { 
    if (*n<=1) return 1; 
    else { 
     (*n)--;//This statement here ....... 
     printf("calculating %d * factorial %d \n",*n,*n); -- used for debugging 
     return ((*n+1) * factorial(n)); 
    } 
} 

但它是讓我驚訝的調試語句的輸出。

calculating 4 * factorial 0 
calculating 3 * factorial 0 
calculating 2 * factorial 0 
calculating 1 * factorial 0 
120 

相同的值* n在每個調試語句中都使用了兩次,並且它顯示了不同的值。如果在陳述中使用兩次這種可能性相同的值,結果會不同。

+0

你可以嘗試打印使用fprintf到標準錯誤?它仍然在做同樣的事情嗎? – yamafontes

回答

3

我只是猜測在這裏,但格式代碼"%d"是爲int,而你通過long long。這是每個值32位的差異。改爲使用"%llu""ll"代替long long"u"代替unsigned)。

+0

現在它的工作。但是我仍然很想知道爲什麼當我們使用%d而不是%llu時會發生這種情況。任何邏輯解釋。 –

+1

@MohitJain因爲int是32位(在大多數平臺上),而long long是64位。第一個「%d」讀取第一個「* n」的低32位,而第二個「%d」讀取同一個值的高32位。 'printf'函數不知道實際的參數,它只是知道「現在我必須打印一個32位整數值,所以把它從堆棧中取出」。 –

0

您正在修改每次遞歸迭代時的值n

當您使用遞歸的指針:

return ((*n+1) * factorial(n)); 

你先計算factorial(n)值。當最後一次遞歸迭代達到時,您已經減少了n,直到0

因此,請不通過n通過參考

+0

這不是問題。當從該函數返回控制權時,n處的變量值增加* n + 1。如果那裏會出現錯誤,那麼最終的輸出結果是不正確的 –

1

因爲你正在使用unsigned long long格式錯誤,測試此一個:

#include <stdio.h> 

long long unsigned factorial(long long unsigned int * n) { 
    if (*n<=1) return 1; 
    else { 
     (*n)--;//This statement here ....... 
     printf("calculating %llu * factorial %llu \n",*n,*n); 
     return ((*n+1) * factorial(n)); 
    } 
} 

int main(void) 
{ 
    long long unsigned int n = 4ULL; 

    n = factorial(&n); 
    printf("%llu\n", n); 
    return 0; 
}