繁体   English   中英

C-while循环挂在条件上

[英]C - while loop hanging on the condition

我是一个新手,正在学习代码,所以这可能很简单,但是我不明白发生了什么。

当我尝试运行以下代码时,它似乎挂在while循环条件上,此后不执行任何代码。 !=运算符是否不适合此操作?

我也尝试了一个do {} while并且一切运行良好,但是一旦我将运算符设置为'E' ,条件就好像挂在那儿了,并没有脱离循环。

#include <stdio.h>

int main(void) {
    float n, content;
    char operator;

    n = content = 0;
    operator = 'a';

    printf("Begin Calculations:\n");

    while (operator != 'E');
    {
        scanf("%f %c", &n, &operator);

        switch (operator) {
        case 's':
        case 'S':
            content = n;
            printf("= %f\n", content);
            break;

        case '+':
            content = content + n;
            printf("= %f\n", content);
            break;

        case '-':
            content = content - n;
            printf("= %f\n", content);
            break;

        case '*':
            content = content * n;
            printf("= %f\n", content);
            break;

        case '/':
            content = content / n;
            printf("= %f\n", content);
            break;

        case 'e':
        case 'E':
            printf("End of calculations\n");
            operator == 'E';
            break;

        default:
            printf("Invalid input\n");
            break;
        }
    }
    return 0;
}

在while语句的末尾删除分号:

while(operator != 'E')
{

分号结束while语句的主体,换句话说,它的行为就像您将编写以下代码:

while(operator != 'E')
{
}

造成无限循环。

  1. 您需要在一会结束while删除分号
  2. 您需要考虑两种情况

所以改变

while(operator != 'E');

while(operator != 'E' && operator != 'e')

while循环中,您有一个经典的错误:

while (operator != 'E');
{

; 在条件被解析为空语句之后,因此如果operator不同于'E'那么while将永远运行。

使用经典的Kernighan和Ritchie大括号样式可以使这种错误显而易见,并且不太可能发生:

while (operator != 'E') {

还要注意,您应该从switch语句退出循环,而不是在while条件下测试E ,这将允许eE都得到正确处理(您的语句operator == 'E';是no op,它是应该写为operator = 'E'; scanf还要检查scanf的返回值,以避免在文件末尾无限循环。

这是一个改进的版本:

#include <stdio.h>

int main(void) {
    float n, content;
    char operator;
    int active = 1;

    n = content = 0;

    printf("Begin Calculations:\n");

    while (active && scanf("%f %c", &n, &operator) == 2) {
        switch (operator) {
        case 's':
        case 'S':
            content = n;
            printf("= %f\n", content);
            break;

        case '+':
            content = content + n;
            printf("= %f\n", content);
            break;

        case '-':
            content = content - n;
            printf("= %f\n", content);
            break;

        case '*':
            content = content * n;
            printf("= %f\n", content);
            break;

        case '/':
            content = content / n;
            printf("= %f\n", content);
            break;

        case 'e':
        case 'E':
            printf("End of calculations\n");
            active = 0;
            break;

        default:
            printf("Invalid input\n");
            break;
        }
    }
    return 0;
}
while(operator != 'E');

正确的语法是while (...) { ... }不带分号,或者do { ... } while (...); 用。

printf("End of calculations\n");
operator == 'E';

赋值运算符是一个= ==更改为= ,应该没问题。

您需要从while循环中删除分号,因为分号意味着语句结束,因此您的程序不会进一步执行

几件事。 1-运算符是保留字,您应该在while()之后更改变量名称2-(分号;)。

检查更新代码:

        #include <stdio.h>

        int main(void)
        {
          float n, content;
          char operator1;

          n = content = 0;
          operator1 = 'a';

          printf("Begin Calculations:\n");

          while(operator1 != 'E')
          {
            scanf("%c", &operator1);

            switch(operator1)
            {
              case 's':
              case 'S':
            content = n;
            printf("= %f\n", content);
            break;

              case '+':
            content = content + n;
            printf("= %f\n", content);
            break;

              case '-':
            content = content - n;
            printf("= %f\n", content);
            break;

              case '*':
            content = content * n;
            printf("= %f\n", content);
            break;

              case '/':
            content = content / n;
            printf("= %f\n", content);
            break;

              case 'e':
              case 'E':
            printf("End of calculations\n");
            operator1 = 'E';
            break;

              default:
            printf("Invalid input\n");
            break;
            }
          }
          return 0;
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM