2011-05-23 192 views
3
do 
{ 
    cout << "Car is coming ... " << "[P]ay or [N]ot?" << endl; 
    ch=getch(); 
} while (ch !='q' || ch != 'Q'); 

为什么上面的代码在下面的代码中不工作?我以各种方式在每个语句周围用括号括住了它,并且编译器每次都会弹出一个错误,直到我按照以下方式重新分组为止。我只是想知道为什么这样做。While While Loop问题

do 
{ 
    cout << "Car is coming ... " << "[P]ay or [N]ot?" << endl; 
    ch=getch(); 
} while (!(ch=='q' || ch=='Q')); 

我使用Visual Studio 2008作为我的编译器; x86架构。

+3

PS:什么游戏是这样的?听起来像疯狂出租车。 :-) – Mehrdad 2011-05-23 23:28:07

回答

16

Learn De Morgan's laws

(未A)或(未B)

是不一样的

不(A或B)。

+0

优雅的答案。 +1! – jwueller 2011-05-23 23:31:21

+0

谢谢,这很有道理。 – Lorek 2011-05-24 00:31:28

0

我觉得你在你的第一个例子要这样:

ch !='q' && ch != 'Q' 

你想输入是不是q而不是Q

3

(ch != 'q' || ch != 'Q')始终为真:“ch不等于'q'ch不等于'Q'”。

2

问题是您的布尔逻辑关闭,两个while条件不一样。

  • 上:性格是不是 'Q' 或不是 'Q'
  • 底:性格是不是( 'Q' 或 'Q')

顶部将为每个返回true单个字符可能。对于除'q'和'Q'之外的每个字符,底部都会返回true。

0

您已经将逻辑向后,这是我否定它的工作原理。根据DeMirgan法律,!(ch == 'Q' || ch == 'q')ch != 'Q' && ch != 'q'相同。

因为如果它不能同时为little qbig Qwhile (ch != 'Q' || ch != 'q')没有意义,因为如果它是'Q',那么它不会是'q',反之亦然。

0

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

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

我使用C#,因此,虽然上面的代码将工作,我会代替这个,因为它更容易阅读:

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

谢谢,我将来可能会对ToUpper()使用类似的功能。 – Lorek 2011-05-24 00:32:32