如果语句没有被捕获

If statement isn't being caught

我一辈子都弄不明白为什么 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;
}

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

当你第一次这样做时

  while(grade2 != -1000) 

变量grade2未初始化。

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

确保像这样初始化它:

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

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

scanf("%d", &grade1);

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)
      {
         ... 

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

不同的写法可能是:

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

      sum = sum + grade2;
      ....

虽然确实应该初始化 grade2 并且应该检查 scanf() 的 return,但这不是张贴者 运行 遇到的主要问题。问题是他检查

if(grade2 != -1000)

在他已经处理完 grade2 之后。他应该搬家

scanf("%d", &grade1);

之前

if(grade2 != -1000)

while 循环中的 if 语句是多余的,因为除非控制它的条件为真,否则循环不会迭代,并且 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++;
        }
    }
}