在while循环中阐明逻辑语句AND和OR

时间:2019-10-28 15:18:02

标签: javascript logical-operators

ANDOR语句在while循环中的行为异常

var a = 0;
var b = 0;

while (a < 3 && b < 3) {
  if (a < 3) {
    a = a + 1
    console.log(a)
    console.log("Ende")
  } else if (b < 3) {
    b = b + 1;
    console.log(b);
  }
}

现在,您希望while循环能够完成工作,直到AND语句中的两个变量都达到3为止。但是事实并非如此,它会一直工作到a达到3,然后停止。

为什么? 如果将其更改为OR运算符,它会在两个变量都达到3时停止。 再次为什么?

1 个答案:

答案 0 :(得分:1)

实际上,该行为在数学上是正确的。不幸的是,英语有时会使andor变得模棱两可。

考虑条件:

a < 3 && b < 3

您的英语直觉使您思考:

  

现在,您希望while循环能够完成工作,直到两个变量都达到3

但这是错误的。只要两个变量均小于3,该条件将起作用。这显然意味着,如果任何变量达到3,则条件为假。即使在英语语法中,这实际上也是正确的,但由于AND和OR的常见用法(在逻辑上不正确)与列表的交互作用而感到困惑。

首先让我们考虑正确的用法:

a < 3 && b < 3-这意味着

  • 两个条件都必须为真(AND的定义)
    • a不得达到3
    • b不得达到3

因此,真值表为:

    a        b        result
 -----------------------------
   < 3      < 3        true
   3++      < 3        false  // AND requires both to be true
   < 3      3++        false  // however OR only requires one to be true
   3++      3++        false

一旦您为AND写下了真值表,您就会明白为什么任何变量达到3都必须停止循环。


现在让我们看看英语是如何使事情变得混乱的。我想指出的是,严格来说英语语法与AND和OR的数学定义相符,但是即使每个人都能直观地理解其含义(每个人都以某种方式魔术地忽略了逻辑),常见用法在技术上也是错误的。

用英语,如果我们有一个列表,我们希望列表中的所有内容(例如购物清单),我们都使用and来加入列表:

I want an orange, an apple AND a banana

以上句子要求一个人购买全部三个水果。

另一方面,如果我们有一个选项列表,则可以使用or将其加入:

You can either walk OR drive there

严格来说,实际规则是,如果您希望列表的所有部分都是真实的/存在,那么您可以使用AND将其加入;如果您只需要列表的至少一部分是真实的/存在,则可以加入或。但这不是英语使用者对AND和OR的解释。我们非正式地使用以前想要的东西或想要一些东西的定义。

当涉及否定(小于触发时),这种微妙的差异成为一个主要问题。我们非正式地了解以下内容:

I don't want apples, I don't want oranges AND I don't want bananas
如-如果有一个苹果,一个橙子和一个香蕉,那么上面的人将不会高兴。但是正确的解释是,即使我们没有给他橙子和香蕉,如果给他一个苹果,这个人也不会高兴。这是因为他什么都不想要,他不是说他只不想把所有三种水果放在一起,也不介意只吃一根香蕉。

现在让我们考虑以下内容:

I don't want an apple and an orange.

乍一看,它看起来与上面的句子相同,只是较短。但是在逻辑上有区别。在这种情况下,此人表示他不想要带有橙色的苹果,但也许可以搭配不带有橙色的苹果。

在表中AND和OR的行为上听起来类似但又根本不同的含义有一个名称。它实际上在布尔代数中有一个定理:它称为DeMorgan's Theorem。它实际上是显而易见的,但乍一看似乎并非如此。

它说明:

( NOT A ) AND ( NOT B ) is the same as NOT ( A OR B )

( NOT A ) OR ( NOT B )  is the same as NOT ( A AND B )

这就是为什么有时当AND无法按照您认为的方式工作时,突然将其更改为OR的原因。