C ++:布尔表达式导致无限循环

时间:2013-09-07 15:39:47

标签: c++

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

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

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

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

  cin >> c;

4 个答案:

答案 0 :(得分:7)

因为该表达式不符合您的想法。正确的是

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

但是你上面提到的那个会发生什么?

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

这是一系列4个布尔值OR。第一个是'n' || 'N',其中char s 'n''N'转换为布尔值(均为true),因此整个表达式为{{1} }}

所以你留下了

true

while (c != true) 相同,并进入循环,直到您输入ASCII值为1的字符。由于这不是可打印字符,键盘输入不会让您退出循环。

答案 1 :(得分:4)

此:

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

相当于:

while (c != true )

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

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

答案 2 :(得分:2)

循环中的条件不正确。

正确的条件是:

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 )

将导致无限循环...

答案 3 :(得分:0)

尝试

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

cin >> c;

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