2013-05-25 2 views
1

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

В 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 

Почему не остановить VM, когда он видит, что 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 

Так что я запутался, почему он автоматически завернуть в & & b вместе? Что такое порядок операций для этих выражений?

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

+0

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence – NINCOMPOOP

ответ

3

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

Смежные вопросы