如果声明没有被抓住

时间:2018-01-31 22:10:53

标签: c if-statement statements

我不能为我的生活弄清楚为什么C忽略了我的if语句。

当输入为-1000时,我试图跳过while语句中的所有过程(因此在退出程序之前它不打印)。这是我的代码:

int main()
{
  int count = 1;
  int grade1;
  int grade2;
  double sum;
  double average;

  printf("Please input a number of grades: \n");

  scanf("%d", &grade1);
  printf("Sum is: %d.000000 \n", grade1);
  printf("Average is: %d.000000 \n", grade1);
  count++;

  sum = grade1;

  while(grade2 != -1000) 
  {
    if(grade2 != -1000)
    {
      scanf("%d", &grade2);

      sum = sum + grade2;
      average = sum / count;

      printf("Sum is: %lf \n", sum);
      printf("Average is: %lf \n", average);

      grade1 = sum; //Converting the sum back into an int
      count++;
    }
  }
  return 0;
}

enter image description here

这是我输出图像的链接。如您所见,即使level2被赋予-1000,if语句也会被忽略,并且在程序退出之前会在屏幕上打印另外2行。我怎样才能解决这个问题?这对C的工作方式有点奇怪吗?

3 个答案:

答案 0 :(得分:5)

第一次执行此操作时

  while(grade2 != -1000) 

变量grade2未初始化。

因此,您的代码具有未定义的行为

确保将其初始化为:

int grade2 = 0; // To zero or whatever you want

此外 - 始终检查scanf返回的值。而不是

scanf("%d", &grade1);

DO

if (scanf("%d", &grade1) != 1)
{
    // Add error handling here
}

您的下一个问题是,在检查是否为-1000之前,您不会扫描grade2。在if语句之前移动扫描。

也许您想要做的是:

  int grade2 = 0;
  while(grade2 != -1000) 
  {
      if (scanf("%d", &grade2) != 1)
      {
          // Add error handling here
      }
      if(grade2 != -1000)
      {
         ... 

以便在执行grade2之前扫描第一个if(grade2 != -1000)并输入计算代码

不同的写法可能是:

  while(1) 
  {
      if (scanf("%d", &grade2) != 1)
      {
          // Add error handling here
      }
      if(grade2 == -1000) break;  // Terminate the while

      sum = sum + grade2;
      ....

答案 1 :(得分:2)

虽然应该初始化grade2并且应该检查scanf()的返回,但这不是海报遇到的主要问题。问题是他检查了

if(grade2 != -1000)

他已经处理了2年级。他应该移动

scanf("%d", &grade1);

if(grade2 != -1000)

答案 2 :(得分:0)

if循环中的while语句是多余的,因为循环不会迭代,除非控制它的条件为真,并且if语句在此之后直接出现,检查对于相同的条件,grade2是未加盖的。

相反,您需要在scanf()调用之后移动它,因为这将修改变量grade2,并且不要忘记在使用它们之前初始化变量,否则您将有未定义行为。

int main(void)
{

    //....
    int grade2 = 0; // initialized...
    //....

    while (grade2 != -1000)
    {
        scanf("%d", &grade2);
        if (grade2 != -1000)
        {
            sum = sum + grade2;
            average = sum / count;

            printf("Sum is: %lf \n", sum);
            printf("Average is: %lf \n", average);

            grade1 = sum; //Converting the sum back into an int
            count++;
        }
    }
}