0

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

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

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

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

  cin >> c;
4

4 回答 4

7

因为那个表达式没有做你认为它做的事情。正确的是

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 的字符。由于这不是可打印字符,因此键盘输入不会让您退出循环。

于 2013-09-07T15:41:26.067 回答
4

这个:

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

相当于:

while (c != true )

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

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

于 2013-09-07T15:42:15.473 回答
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 )

这将导致无限循环......

于 2013-09-07T15:42:19.133 回答
0

尝试

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

cin >> c;

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

于 2013-09-07T15:40:53.957 回答