在我的计算机科学入门课程中,一个提示问我们:
“给定已经声明的char变量c,写一些代码,重复从标准输入读取一个值到c,直到最后输入'Y'或'y'或'N'或'n' 。“
我输入的代码导致无限循环,但逻辑对我有意义。有人可以解释为什么以下布尔表达式有问题吗?
while (c != ('n' || 'N' || 'y' || 'Y'))
cin >> c;
答案 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'
总是等于真(非零)。这就是循环没有终止的原因。