边做边循环问题

Do While Loop Question

本文关键字:问题 循环      更新时间:2023-10-16
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体系结构。

学习德

摩根定律

(不是

A)或(不是 B)

不是(A 或 B)。

(ch != 'q' || ch != 'Q')总是正确的:"ch不等于'q'ch不等于'Q'"。

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

  • 顶部:字符不是"q"或不是"Q"
  • 底部:字符不是("q"或"Q")

对于每个可能的字符,顶部将返回 true。 底部将为每个字符返回 true,除了"q"和"Q"

我认为您希望在第一个示例中这样做:

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

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

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

你的逻辑倒过来了,这是我否定它的工作。 根据德米尔根定律,!(ch == 'Q' || ch == 'q')ch != 'Q' && ch != 'q'相同。

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

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

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

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

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