输出的说明

时间:2013-10-15 08:08:24

标签: c visual-studio-2010 pointers recursion

您好我已经在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的值)正如预期的那样出现,但它是令我感到惊讶的调试语句的输出。

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

相同的值* n在每个调试语句中使用两次,它显示不同的值。如果在语句中使用两次相同的值,可能会产生不同的结果。

3 个答案:

答案 0 :(得分:3)

我只是在这里猜测,但格式代码"%d"适用于int,而您传递long long。这是每个值32位的差异。请改为使用"%llu""ll"代表long long"u"代表unsigned

答案 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;
}

答案 2 :(得分:0)

您正在每次递归迭代时修改n的值。

使用指针进行递归时:

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

您首先计算factorial(n)的值。当达到最后一次递归迭代时,您已经将n递减到0

所以,请不要通过引用传递n