Порядок оценки короткого замыкания

Все это время мои мысли об оценке короткого замыкания кажутся неправильными.

В javascript:

var a = false, b = true, c=true;
a && b || c; // Evaluates to true

По сравнению с

var a = false, b = true, c=true;
a && (b || c); // Evaluates to true

Почему виртуальная машина не останавливается, когда видит, что a ложно?

Более явный пример:

function a(){
  console.log("I'm A");
  return false;
}
function b(){
  console.log("I'm B");
  return true;
}
function c(){
  console.log("I'm C");
  return true;
}

a() && b() || c();

Результат:

I'm A
I'm C
true

Так очевидно

a && b || c === (a && b) || c

Итак, я запутался, почему он автоматически объединяет a && b вместе? Каков именно порядок операций с этими выражениями?

Большинство языков придерживаются этого порядка (похоже, что PHP такой)?


person K2xL    schedule 25.05.2013    source источник
comment
comment
С начальной школы я всегда видел AND как умножение и OR как сложение; при этом легче запомнить, какой из них имеет приоритет при группировке (в математическом выражении умножение вычисляется до сложения).   -  person Kamafeather    schedule 09.10.2018


Ответы (1)


Применяются следующие простые правила:
- ярлыки при вычислении логических выражений не означают, что выражения вычисляются неправильно, т.е. результат такой же, как при использовании ярлыков, так и без них;
- логический оператор AND (&&) имеет более высокий приоритет, чем OR (||). Вот почему a && b «обернуты» вместе;
- полагаться на порядок приоритета небезопасно, используйте круглые скобки; это также улучшает читаемость;
- большинство языков делают ярлыки при вычислении логических выражений, если результат уже определен, в т. PHP; Однако есть исключения, особенно в языках обратной польской записи, таких как PostScript.

person Stefanov.sm    schedule 25.05.2013