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

为什么虚拟机在看到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似乎是这样的)?

4

1 回答 1

3

这些简单的规则适用:
- 逻辑表达式求值中的捷径并不意味着表达式的求值不正确,即结果与捷径相同或没有捷径;
- AND布尔运算符(&&)的优先级高于OR (||)。这就是为什么a && b被“包裹”在一起的原因;
- 依赖优先顺序是不安全的,使用括号;这也提高了可读性;
- 如果结果已经定义,大多数语言在评估逻辑表达式时都会使用快捷方式,包括。PHP; 但也有例外,尤其是在 PostScript 等反向波兰符号语言中。

于 2013-05-25T18:26:32.653 回答