做循环问题

时间:2011-05-23 23:25:24

标签: c++ while-loop

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

7 个答案:

答案 0 :(得分:16)

Learn De Morgan's laws

(不是A)或(不是B)

不同

不是(A或B)。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

  • 上:字符不是'q'或不是'Q'
  • 底部:字符不是('q'或'Q')

对于每个可能的角色,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 qbig Q不同时while (ch != 'Q' || ch != 'q')没有意义,因为如果它是'Q'则不会' q',反之亦然。

答案 6 :(得分:0)

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

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

我使用C#,所以虽然上面的代码可以使用,但我会使用它,因为它更容易阅读:

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