unsigned long int使变量等于0

时间:2015-09-13 18:31:56

标签: c type-conversion

我有以下代码应该计算给定数字的阶乘:

#include <stdio.h>

int main()
{
   unsigned short int n, i;
   unsigned long int fact=1;

   printf("Give n:");
   scanf("%u", &n);
   printf("\nfact=%u", fact);

   for(i = 1; i <= n; i++)
        fact = fact * i;

   printf("\n%u!=%u", n, fact);
   return 0;
}

我试图检查问题是什么,发现变量事实为0。 有人可以向我解释为什么变量事实是0,因为我用1初始化它? 如果它有任何重要性,我在Codeblocks中使用GNU GCC编译器。

1 个答案:

答案 0 :(得分:3)

由于您正在使用GCC,因此您应该使用-Wall作为选项,它可以准确地告诉您问题所在:

prog.c: In function ‘main’:
prog.c:9:4: warning: format ‘%u’ expects argument of type ‘unsigned int *’, but argument 2 has type ‘short unsigned int *’ [-Wformat=]
    scanf("%u", &n);
    ^

你告诉它在unsigned int变量中读取一个值,但是你给的是unsigned short的指针,它更小,所以它会覆盖n之后的任何内容。在堆栈框架中,导致未定义的行为 - 在您的情况下,损坏fact

道德:始终使用-Wall启用警告,并注意它们......