【问题标题】:Cannot exit the loop using || operator无法使用 || 退出循环操作员
【发布时间】:2016-02-25 02:41:50
【问题描述】:

您能否解释一下为什么当我在循环中使用短路或时我的代码“挂起”?

我写了一个代码来计算两个整数的最大公因数:

  int a = 9;
  int b = 6;

      while (a != 0 || b != 0) //here is the problem
       {
           if (a >= b)
           {
               a = a - b;
           }
           else
               b = b - a;
       }
       if (a == 0) System.out.println(b);
       else System.out.println(a);

当我使用 ||操作员,对我来说似乎合乎逻辑的是,我的程序的运行永远不会停止。但是,当我使用 && 运算符时,对我来说似乎不合逻辑的东西,它工作得很好。你能解释一下为什么我不能使用 || 退出循环吗?运营商?

【问题讨论】:

  • 你为什么期望它们都为零?
  • 工作表达式的正确德摩根变换是while (!(a == 0 || b == 0))
  • 有一种情况,其中任何一个都为零,在这种情况下,如果您使用短路 OR 运算符,第二个参数将始终为 true ...请在这种情况下使用短路 AND 运算符。 ..所以如果其中一个为零,则停止循环...

标签: java operators short-circuiting


【解决方案1】:

让我们一步一步检查输出(每一步对应一个循环):

第 1 步:

a >= b is true so a is now equal to 3

第 2 步:

b >= a is true so b is now equal to 3

第 3 步:

a >= b is true so a is now equal to 0

让我们停在这里。当 a OR b 不等于 0 时,while 循环将继续运行。在所有后续循环中,b 将设置为 3 - 0,并且值永远不会改变 - 它将无限运行。如果您的目标是在 1 值达到 0 时停止循环,则需要 && 语句。

【讨论】:

    【解决方案2】:

    通过使用 AND,您的意思是“如果 1 为零,则退出循环”。如果使用 OR,则表示“如果两者都为零,则退出循环”。它与您的想法相反,这就是您可能会感到困惑的原因。当你否定这样的布尔运算符时,AND 变为 OR,反之亦然。您可以通过DeMorgan's Laws. 了解更多信息

    【讨论】:

    • 谢谢,我真的很困惑
    • @Strig 没问题。这是常见的混淆。永远记住带否定的德摩根定律。
    猜你喜欢
    • 2021-07-23
    • 2020-11-23
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多