Pinkman2021 发表于 2021-11-11 10:06:11

关于while的条件停止问题

在问题中,
(ch = getchar()) != '\n' 与 ch = getchar() && ch != '\n' 分别作为while的停止条件,但是句1能停止,另句2不能,求助原因.
代码如下:

#include <stdio.h>

int main()
{
      int ch, count = 0;

      printf("请输入一行英文句子:");

      while ((ch = getchar()) != '\n')
      {
                if (ch >= 'A' && ch <= 'Z')
                {
                        count = count + 1;
                }
      }

      printf("你总共输入了%d个大写字母!\n", count);

      return 0;
}

==================================================

#include <stdio.h>

int main()
{
      int ch, count = 0;

      printf("请输入一行英文句子:");

      while (ch = getchar() && ch != '\n')
      {
                if (ch >= 'A' && ch <= 'Z')
                {
                        count = count + 1;
                }
      }

      printf("你总共输入了%d个大写字母!\n", count);

      return 0;
}

hrpzcf 发表于 2021-11-11 10:06:12

本帖最后由 hrpzcf 于 2021-11-11 10:51 编辑

赋值运算符 = 的优先级是比逻辑与运算符 && 优先级第的,即ch = getchar() && ch != '\n'相当于ch = (getchar() && ch != '\n')这逻辑就不对了,刚开始运行ch是垃圾值,ch != '\n' 十有八九是真,getchar()返回非0也是真,整个表达式就是 ch = 1,赋值表达式 ch = 1 的值也是 1,最终结果就是 while (1),肯定停不下来了

村里小黑 发表于 2021-11-11 10:40:11

#include <stdio.h>

int main()
{
      int ch, count = 0;

      printf("请输入一行英文句子:");
      
      while ((ch = getchar() )&& ch != '\n')
      {
                if (ch >= 'A' && ch <= 'Z')
                {
                        count = count + 1;
                }
      }

      printf("你总共输入了%d个大写字母!\n", count);

      return 0;
}

这样就好了,你要先给ch赋值,然后再去判断ch是否为’\n‘

jhq999 发表于 2021-11-11 10:49:45

本帖最后由 jhq999 于 2021-11-11 10:51 编辑

等号运算优先级低,不加括号就会想计算等号后面的然后赋值给ch
页: [1]
查看完整版本: 关于while的条件停止问题