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));
    }
}

最終的な出力 (factorial の値) は期待どおりですが、驚くべきは debug ステートメントの出力です。

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

すべてのデバッグ ステートメントで同じ値 *n が 2 回使用され、異なる値が表示されます。ステートメントで同じ値を 2 回使用すると、どのようにして異なる結果が得られるのでしょうか。

4

3 に答える 3

3

私はここで推測しているだけですが、フォーマットコード"%d"は forintですが、long long. これは、値ごとに 32 ビットの違いです。"%llu"代わりに ( "ll"for long long"u"for ) を使用しunsignedます。

于 2013-10-15T08:18:33.817 に答える
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;
}
于 2013-10-15T08:20:08.057 に答える
0

n各再帰反復での値を変更しています。

ポインターで再帰を使用している場合:

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

最初に の値を計算しますfactorial(n)。最後の再帰反復に達したとき、あなたはすでに until をデクリメントしていnます0

そのため、 参照渡しは行わないnでください。

于 2013-10-15T08:20:05.790 に答える