1
#include<iostream>
using namespace std;

int main()
{

    char again;
    do
    {
        cout<<"you are in the while loop";
        cout<<"do you want to continue looping?";
        cin>>again;
    } while (again != 'n' || again != 'N');

    system("pause");
    return 0;
}

我知道“while”中的测试条件有问题。但我无法弄清楚。

当用户的输入既不是'n'也不是'N'时,循环应该继续打印代码“你在while循环中”。一旦按下“n”或“N”,程序将终止。

但是对于我的代码,无论我输入什么字符,程序都会继续循环代码。但是当我改变'||' '&&',程序可以根据需要运行。任何人都可以告诉我发生了什么?

4

7 回答 7

11

这是一个常见的布尔逻辑问题。 ||意思是“或”,意思是“只要这一边是真的,那么这个表达式就是真的”。因此,当您将大写字母传递'N'c != 'n' || c != 'N' 程序时会说“嗯,'N'不等于'n',因此表达式的一侧为真,因此整个表达式为真,无需检查表达式的其余部分。” 即使按下小写'n',程序也会说“嗯,'n'等于'n',但不等于'N',因此表达式的一侧为真,因此整个表达式为真。” 这就是你的 while 循环中发生的事情。

另一方面,&&表示“和”,表示“表达式的双方都必须为真”;当您将大写字母传递'N'c != 'n' && c != 'N'程序时认为“'N'不等于'n',但等于'N',因此表达式只有一侧为真,因此表达式为假。”

这会让人感到困惑,因为如果您正在测试输入的字符是否等于您将使用的特定值||(例如,“我想知道是否输入了'a' 'b' 'c'”)。

基本上,当您将||用于特定表达式并且想要与该表达式相反时,您需要更改为&&(例如,我不想要'a''b''c'; 或者换一种说法,该值不能是'a' 不能是'b',并且不能是'c'")。同样,如果您要&&用于特定表达式,并且想要与该表达式相反的表达式,则需要使用||。这是德摩根定律之一,我建议您阅读一下您可以避免自己重新发现它们中的每一个。

于 2009-03-15T07:10:29.187 回答
10

是的:|| 是“或”,&& 是“和”。

每个字符要么是“not 'n'”,要么是“not 'N'”,因为它不可能同时是'n' 和 'N'。

另一种(可能更容易阅读)编写条件的方法是:

!(again == 'n' || again == 'N')

这意味着“(再次是'n'或'N')的反面

于 2009-03-15T06:59:54.003 回答
9

它是被称为“德摩根定律”的布尔代数。

Not (P And Q) = (Not P) Or (Not Q)
Not (P Or Q) = (Not P) And (Not Q)

在您的情况下,您希望用户不要输入'n'or 'N',可以将其转换为此逻辑。

!(again == 'n' || again == 'N')

当应用德摩根定律时,它将是

(again != 'n' && again != 'N')

有关更多信息,您可能需要阅读命题逻辑

于 2009-03-15T07:16:30.407 回答
5

虽然原来的海报现在很高兴,但我在其他答案中没有看到这一点:

(true  && true ) == true
(true  && false) == false
(false && true ) == false
(false && false) == false

(true  || true ) == true
(true  || false) == true
(false || true ) == true
(false || false) == false

!true  == false
!false == true

这就是一切!

于 2009-03-15T07:59:21.987 回答
2

我很理解你的问题,下面是解释:

do-while 循环是一个退出条件循环。这意味着循环的主体总是首先执行。然后,评估测试条件。如果测试条件为 TRUE,则程序再次执行循环体。如果测试条件为 FALSE,则循环终止,程序继续执行 while 后面的语句。

在您的代码中,当您按下“n”或“N”时,您的测试条件将始终为一真一假,所以当您使用 || 您将满足测试条件 (true||false=true) ,因此程序将再次执行循环体。但是当你使用 && 时,这将给出 (true && false =false),不再统计测试条件,因此程序不会再次执行循环体。

我希望这会有所帮助.....享受编程!阿梅拉迪

于 2013-02-03T23:41:31.447 回答
1

&& 是一个逻辑与。|| 是逻辑或。

(另外,& 是按位与,| 是按位或。)

于 2009-03-15T07:00:16.827 回答
0

你可能想试试 while(!(again == 'n' || again == 'N'))

于 2009-03-15T07:01:09.693 回答