我有以下代码应该计算给定数字的阶乘:
#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编译器。
答案 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
启用警告,并注意它们......