Do While循环问题

3
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架构。


3
附言:这是什么游戏?听起来像《疯狂出租车》。 :-) - user541686
7个回答

16

3
"(ch != 'q' || ch != 'Q')"始终为真,即"ch不等于'q'"或者"ch不等于'Q'"。请注意保留HTML标记。

2
问题在于你的布尔逻辑有误,而且两个 while 条件不一样。
  • 上面的条件是:字符不是 'q' 或者不是 'Q'
  • 下面的条件是:字符不是 ('q' 或者 'Q')
上面的条件对于任何一个字符都会返回 true。而下面的条件对于除了 'q' 和 'Q' 以外的所有字符都会返回 true。

0
我认为您想在第一个示例中使用这个:
ch !='q' && ch != 'Q'

您希望输入既不是q也不是Q


0

当你使用'!'来反转所有逻辑时,你通过将条件运算符"=="反转为"!="做得很对,但你忘记了将逻辑运算符"||"反转为"&&"。因此,这应该是正确的:

while (ch!='q' && ch!='Q');

我使用C#,所以虽然上面的代码可以工作,但我会使用这个更容易阅读的代码:

while (ch.ToUpper() != 'Q');

谢谢,我将来可能会使用类似于ToUpper()的函数。 - user705185

0

!(ch=='q' || ch=='Q') 等同于 ch!='q' && ch!='Q'。另请参见德摩根定律


0

你的逻辑是反过来的,这就是为什么我的否定会起作用。根据DeMirgan的法则,!(ch == 'Q' || ch == 'q')ch != 'Q' && ch != 'q'是相同的。

由于如果它不能同时是小写q大写Q,所以while (ch != 'Q' || ch != 'q')没有意义,因为如果它是'Q',那么它就不会是'q',反之亦然。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接