do
{
cout << "Car is coming ... " << "[P]ay or [N]ot?" << endl;
ch=getch();
} while ( ch !='q' || ch != 'Q');
为什么上面的代码在下面的代码中不起作用?我用各种方式围绕每个语句用括号尝试它,编译器每次都会弹出一个错误,直到我重新组织它们,如下所示。我只是想知道为什么会这样做。
do
{
cout << "Car is coming ... " << "[P]ay or [N]ot?" << endl;
ch=getch();
} while ( !(ch=='q' || ch=='Q') );
我正在使用Visual Studio 2008作为我的编译器; x86架构。
答案 0 :(得分:16)
答案 1 :(得分:3)
(ch != 'q' || ch != 'Q')
始终为真:“ch
不等于'q'
或ch
不等于'Q'
”。
答案 2 :(得分:2)
问题是你的布尔逻辑是关闭的,两个while
条件不一样。
对于每个可能的角色,Top将返回true。除了'q'和'Q'
之外,每个字符的底部都会返回true答案 3 :(得分:0)
我想你在第一个例子中想要这个:
ch !='q' && ch != 'Q'
您希望输入不是q
而不是Q
。
答案 4 :(得分:0)
!(ch=='q' || ch=='Q')
相当于ch!='q' && ch!='Q'
。另请参阅De Morgan's laws。
答案 5 :(得分:0)
你有倒退的逻辑,这是我的否定它的作用。根据DeMirgan的定律,!(ch == 'Q' || ch == 'q')
与ch != 'Q' && ch != 'q'
相同。
由于如果同时little q
和big Q
不同时while (ch != 'Q' || ch != 'q')
没有意义,因为如果它是'Q'则不会' q',反之亦然。
答案 6 :(得分:0)
当使用'!'反转所有逻辑时,你通过将条件运算符“==”反转为“!=”来做对,但是你忘了反转逻辑运算符“||”到“&amp;&amp;”。因此,这应该是正确的:
while (ch!='q' && ch!='Q');
我使用C#,所以虽然上面的代码可以使用,但我会使用它,因为它更容易阅读:
while (ch.ToUpper() != 'Q');