【问题标题】:C++: Boolean Expression Causing Infinite While LoopC ++:导致无限While循环的布尔表达式
【发布时间】:2013-09-07 15:39:47
【问题描述】:

在我的计算机科学入门课上,有一个提示问我们:

“给定一个已经声明的 char 变量 c,编写一些代码,重复从标准输入读取一个值到 c 中,直到最后输入一个 'Y' 或 'y' 或 'N' 或 'n' 。”

我输入的代码会导致无限循环,但逻辑对我来说是有意义的。有人能解释一下为什么下面的布尔表达式有问题吗?

while (c != ('n' || 'N' || 'y' || 'Y'))

  cin >> c;

【问题讨论】:

标签: c++


【解决方案1】:

因为那个表达式并没有像你想象的那样做。正确的是

while (c !='n' && c != 'N' && c!= 'y' && c != 'Y')

但是你上面介绍的那个会发生什么?

('n' || 'N' || 'y' || 'Y')

这是一系列 4 个布尔 OR。第一个是'n' || 'N',其中chars'n''N'被转换为布尔值(都是true),因此整个表达式是true

所以你就剩下了

while (c != true)

c != 1 相同,并进入循环,直到您输入 ASCII 值为 1 的字符。由于该字符不是可打印字符,因此键盘输入不会使您退出循环。

【讨论】:

    【解决方案2】:

    这个:

    while (c != ('n' || 'N' || 'y' || 'Y'))

    相当于:

    while (c != true )

    因为当其中一个或多个非零值时,任何一组值 ORd 一起将评估为 true。您可能正在寻找的是:

    while ( c != 'n' && c != 'N' && c != 'y' && c != 'Y' )

    【讨论】:

      【解决方案3】:

      循环中的条件不正确。

      正确的条件是:

      while ( c != 'n' && c != 'N' && c != 'y' && c != 'Y' )
      {
          // ...
      }
      

      当你写作时:

      while (c != ('n' || 'N' || 'y' || 'Y'))
      

      您问c 是否与('n' || 'N' || 'y' || 'Y') 不同。但是这个表达式本身将被评估为true,因为非零值 ORd 一起总是被评估为true。所以你的条件相当于:

      while( c != true )
      

      这会导致无限循环...

      【讨论】:

        【解决方案4】:

        试试

        while (c !='n' && c!='N' && c!= 'y' && c!='Y')
        
        cin >> c;
        

        您正在“或”'n','N','y','Y',它始终等于真(非零)。这就是循环没有终止的原因。

        【讨论】:

        • 您的建议也将始终评估为true,因为它不能同时是所有四个值。您需要使用&&,而不是||
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        • 2022-09-24
        相关资源
        最近更新 更多