如果没有抓住声明

Kin*_*ird -1 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;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

438*_*427 5

当你第一次这样做时

  while(grade2 != -1000) 
Run Code Online (Sandbox Code Playgroud)

变量grade2未初始化.

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

确保将其初始化为:

int grade2 = 0; // To zero or whatever you want
Run Code Online (Sandbox Code Playgroud)

进一步 - 始终检查返回的值scanf.而不是

scanf("%d", &grade1);
Run Code Online (Sandbox Code Playgroud)

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

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

也许你想要做的是:

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

这样您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;
      ....
Run Code Online (Sandbox Code Playgroud)