Разъяснение логических операторов AND и OR в цикле while - PullRequest
0 голосов
/ 28 октября 2019

AND и OR операторы ведут себя странно в цикле 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 будет работать, пока обе переменные не достигнут значения 3 в операторе AND. Однако это не так, он выполняет свою работу до тех пор, пока a не достигнет 3, затем остановится.

Почему? Если вы измените его на OR Оператор, он не остановится, пока обе переменные не достигнут 3. Еще раз, почему?

1 Ответ

1 голос
/ 28 октября 2019

На самом деле поведение математически правильно. К сожалению, английский язык иногда может привести к неоднозначности and и or.

Рассмотрим условие:

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

Строго говоря, действительное правило - если вы хотите, чтобы все части списка были истинными/ Чтобы существовать, вы присоединяетесь к нему с помощью И, и если вам нужно, чтобы хотя бы одна часть списка была истинной / существующей, вы присоединяете его с помощью ИЛИ. Но это не то, как носители английского языка интерпретируют И и ИЛИ. Мы неофициально используем предыдущее определение желания чего-либо или желания чего-то еще.

Это тонкое различие становится основной проблемой, когда происходит отрицание (чем меньше, то и оно вызывает). Неформально мы понимаем следующее:

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.

На первый взгляд выглядит так же, как и предложение выше, только короче. Однако логически есть разница. В этом случае человек заявляет, что ему не нужно яблоко с апельсином, но, возможно, он в порядке с яблоком без апельсина.

Это похожее звучание, но радикально отличающееся значение того, как И и ИЛИ ведет себя в списках, имеетимя. На самом деле у него есть теорема в булевой алгебре: она называется Теорема Деморгана . Это на самом деле очевидно, но на первый взгляд не так.

В нем говорится:

( 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 не работаетто, как вы думаете, что это изменило его на ИЛИ, внезапно работает.

...