为什么这段代码在C中没有正常运行的原因是什么?

时间:2017-10-30 18:22:43

标签: c for-loop if-statement

我正在尝试学习C但是我的代码运行不正常。它总是会给出致命的错误。我认为for循环存在问题。我该如何修复它?

#include<stdio.h>
int main( void )
{
   int a  ;
   int b = 1 ;
   int i = 0 ;
   printf("Enter a number:");
   scanf("%d",&a);

   if(a=0)
       printf("Factorial=1");

   else if (a > 0){
       for(i=1 ; i<=a ;i++){
       b = 1;
       b *= i; 
       }
       printf("Factorial=%d",b);
   }     
   else  
       printf("FATAL ERROR");

return 0;
}

2 个答案:

答案 0 :(得分:2)

if(a==0)未分配使用比较。

您想使用比较,但最终使用了作业。

if(a=0)if(0)相同,因此执行else部分。 1

但该部分也会查找a>0,但事实并非如此。

所以它会打印FATAL ERROR

1。发生这种情况是因为赋值表达式的结果是表达式

的值

我需要做些什么来计算阶乘?

fact(0)=1
fact(1)=1
fact(n)=n*fact(n-1);

所以你会做类似

的事情
for(int i=1;i<=a;i++)
  b*=i;

您不需要b=1部分,因为它正在制作所有内容1.因此您的计算值不会被保留。

所以完整的更正代码将是

#include<stdio.h>
int main()
{
   int a;
   int b = 1 ;
   int i = 0 ;
   printf("Enter a number:");
   scanf("%d",&a);

   if(a=0)
       printf("Factorial=1");
   else if (a > 0){
       for(i=1 ; i<=a ;i++){
         b *= i; // don't overwrite value of b with 1
       }
       printf("Factorial=%d",b);
   }     
   else  
       printf("FATAL ERROR");

return 0;
}

答案 1 :(得分:1)

有两个主要问题。 首先使用if(a=0)会导致分配代替if(a==0)实现的比较。 其次

for(i=1 ; i<=a ;i++)
{
 b = 1;
 b *= i; 
}

这段代码也有问题。您在每次迭代后都会b=1覆盖中间结果,从而导致错误的答案。由于您已在代码中将b初始化为1,因此根本不需要此行。

for(i=1 ; i<=a ;i++)
{  
     b *= i; 
}

另外值得一提的是,您始终获得fatal error的原因是因为您在if条件下所做的事情。由于if(a=0),变量a被赋值0。因此,不满足ifelse if条件,导致每次都执行else块。