【问题标题】:Short Circuit Evaluation Order短路评估命令
【发布时间】:2013-05-21 01:00:37
【问题描述】:

一直以来,我对短路评估的想法似乎都是错误的。

在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

所以我很困惑,为什么它会自动将 a && b 包装在一起?这些表达式的运算顺序究竟是什么?

大部分语言都遵循这个顺序吗(PHP 好像是这样的)?

【问题讨论】:

标签: javascript boolean evaluation short-circuiting


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 2017-01-21
    • 2012-02-10
    • 2010-12-21
    • 1970-01-01
    • 2021-11-21
    • 2016-11-26
    • 2019-05-12
    相关资源
    最近更新 更多