2016-09-19 38 views
1

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

当我尝试运行以下代码时,它似乎挂在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; 
} 
+2

'运营商== 'E';'会不会将e'转换为E'。请启用编译器警告! –

回答

1

您的while循环经典的错误:

while (operator != 'E'); 
{ 

将条件解析为en空语句后的;,因此如果operator'E'不同,则您的while将永久运行。

采用经典的Kernighan和Ritchie括号风格使得发生这种错误明显,不太可能:

while (operator != 'E') { 

还要注意的是,你应该从switch语句而不是测试中退出的环路Ewhile条件,这将允许双方eE要正确处理(你的说法operator == 'E';是一个无操作,应书面operator = 'E';。同时检查的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; 
} 
+0

经典; (分号)的确如此,感谢我现在得到它的深入响应。 –

2

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

while(operator != 'E') 
{ 

分号结束,而语句体,换句话说,它的行为就好像你会这样写:

while(operator != 'E') 
{ 
} 

造成无限循环。

2
  1. 你需要在while
  2. 你到底需要删除分号考虑到这两种情况下

因此改变

while(operator != 'E'); 

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

正确的语法是while (...) { ... }没有分号或do { ... } while (...);与。

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

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

0

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

+0

_program未执行进一步_ - 这是不正确的 –

0

几件事情。 1运算符是一个保留字,你应该改变变量名 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; 
     } 
+0

感谢操作员提示,我会牢记这一点。 –