【问题标题】:what is the difference in using && and || in the do...while loop?使用 && 和 || 有什么区别在 do...while 循环中?
【发布时间】:2009-03-15 06:57:56
【问题描述】:
#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”,程序将终止。

但是对于我的代码,无论我输入什么字符,程序都会继续循环代码。 但是当我改变'||' '&&',程序可以根据需要运行。 谁能告诉我这是怎么回事?

【问题讨论】:

    标签: c++ boolean-logic


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      每个字符都是either“not 'n'”或“not 'N'”,因为它不可能both' n' 和 'N' 同时出现。

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

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

      意思是“(同样是either'n'或'N')的对立面”。

      【讨论】:

        【解决方案3】:

        它是布尔代数,称为“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')
        

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

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

        更多信息,您可能想阅读Propositional logic

        【讨论】:

          【解决方案4】:

          虽然原发帖人现在很开心,但我在其他答案中没有看到这一点:

          (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
          

          就是这样!

          【讨论】:

          • 你忘记了 true != false ;] (另外,你必须要小心一点;声明 false &amp;&amp; true == false 的计算结果为 false...优先级和所有)
          • 好吧好吧,我加了括号!我的意思不是这些以表达式的形式出现在程序中。 :)
          • @Earwicker - 是的,但是如果看不到 && 和 ||... 之间的区别... :]
          • 要了解递归,首先你必须了解递归。
          【解决方案5】:

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

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

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

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

          【讨论】:

            【解决方案6】:

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

            (同样,& 是按位与,| 是按位或。)

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2022-01-03
                • 2013-04-10
                • 2011-04-07
                • 2022-12-12
                • 2011-04-01
                • 2015-12-20
                • 2016-04-01
                • 1970-01-01
                相关资源
                最近更新 更多