在我的计算机科学入门课上,有一个提示问我们:
“给定一个已经声明的 char 变量 c,编写一些代码,重复从标准输入中读取一个值到 c 中,直到最后输入了 'Y' 或 'y' 或 'N' 或 'n' 。”
我输入的代码会导致无限循环,但逻辑对我来说是有意义的。有人可以解释一下为什么下面的布尔表达式是错误的吗?
while (c != ('n' || 'N' || 'y' || 'Y'))
cin >> c;
在我的计算机科学入门课上,有一个提示问我们:
“给定一个已经声明的 char 变量 c,编写一些代码,重复从标准输入中读取一个值到 c 中,直到最后输入了 'Y' 或 'y' 或 'N' 或 'n' 。”
我输入的代码会导致无限循环,但逻辑对我来说是有意义的。有人可以解释一下为什么下面的布尔表达式是错误的吗?
while (c != ('n' || 'N' || 'y' || 'Y'))
cin >> c;
因为那个表达式没有做你认为它做的事情。正确的是
while (c !='n' && c != 'N' && c!= 'y' && c != 'Y')
但是你上面介绍的那个会发生什么?
('n' || 'N' || 'y' || 'Y')
这是一系列 4 个布尔 OR。第一个是'n' || 'N'
,其中char
s'n'
和'N'
被转换为布尔值(两者true
),因此整个表达式是true
。
所以你只剩下
while (c != true)
这与 , 相同c != 1
,并进入循环,直到您输入 ASCII 值为 1 的字符。由于这不是可打印字符,因此键盘输入不会让您退出循环。
这个:
while (c != ('n' || 'N' || 'y' || 'Y'))
相当于:
while (c != true )
因为任何一组值 ORd 一起将评估到true
它们中的一个或多个非零时。您可能正在寻找的是:
while ( c != 'n' && c != 'N' && c != 'y' && c != 'Y' )
循环中的条件不正确。
正确的条件是:
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 )
这将导致无限循环......
尝试
while (c !='n' && c!='N' && c!= 'y' && c!='Y')
cin >> c;
你是“或” 'n','N','y','Y'
,它总是等于真(非零)。这就是循环没有终止的原因。