使用&&有什么区别和||在do ... while循环中?

时间:2009-03-15 06:57:56

标签: c++ boolean-logic

#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'后,程序将被终止。

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

7 个答案:

答案 0 :(得分:10)

是:||是“或”和&amp;&amp;是“和”。

每个字符要么“不是'n'”或“不是'N'”,因为它不可能两者' n'和'N'同时出现。

另一种(可能更简单的阅读)写条件的方式是:

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

表示“相反(又 'n'或'N')”。

答案 1 :(得分:9)

这是一个常见的布尔逻辑问题。 ||表示“或”,意思是“只要这一方的一方是真的,那么表达式就是真的。”因此,当您将大写'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'“。同样,如果您将&&用于特定表达式,并且您希望与该表达式相反,那么您需要使用||。这是De Morgan的法律之一,我建议你阅读,这样你就可以避免自己重新发现它们。

答案 2 :(得分:9)

这是一个名为“De Morgan's laws”的布尔代数。

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

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

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

在应用De Morgan的法律时,它将是

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

有关详细信息,您可能需要阅读Propositional logic

答案 3 :(得分: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

这就是一切!

答案 4 :(得分:2)

我理解你的问题,这里有解释:

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

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

我希望有用.....享受编程! Ameraradi

答案 5 :(得分:1)

&安培;&安培;是一个逻辑AND。 ||是一个合乎逻辑的OR。

(另外,&amp;是按位AND,|是按位OR。)

答案 6 :(得分:0)

你可能想尝试一下(!(再次=='n'||再次=='N'))