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

1 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;
}
Run Code Online (Sandbox Code Playgroud)

我知道'while'中的测试条件有问题.但我无法弄明白.

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

但是对于我的代码,程序将继续循环代码,无论我输入什么字符.但当我改变'||'时 到'&&',程序可以按需运行.谁能告诉我发生了什么?

Jon*_*eet 10

是的:|| 是"或"而&&是"和".

每个字符是任一 "不'N’"或"不是'N’",因为它不可能是两个 "n"和"N"同时.

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

!(again == 'n' || again == 'N')
Run Code Online (Sandbox Code Playgroud)

这意味着"相反的(同样是任一 'n’或'N’)".


Max*_*ert 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'").同样的,如果你会使用&&特定的表情,和你想要的表达,那么你需要使用的相反||,这是德摩根定律,我建议你就这么读了一个你可以避免自己重新发现它们.


Cha*_*pol 9

这是一个名为" De Morgan定律 " 的布尔代数.

Not (P And Q) = (Not P) Or (Not Q)
Not (P Or Q) = (Not P) And (Not Q)
Run Code Online (Sandbox Code Playgroud)

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

!(again == 'n' || again == 'N')
Run Code Online (Sandbox Code Playgroud)

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

(again != 'n' && again != 'N')
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*ker 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
Run Code Online (Sandbox Code Playgroud)

这就是一切!