这段时间我对短路评估的看法似乎都是错误的。
在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似乎是这样的)?
答案 0 :(得分:3)
这些简单的规则适用:
- 逻辑表达式评估中的快捷方式并不意味着表达式被错误地评估,即结果与快捷方式相同或无效;
- AND 布尔运算符(&&)的优先级高于 OR(||)。这就是为什么 a&& b 被“包裹”在一起;
- 依靠优先顺序是不安全的,使用括号;这也提高了可读性;
- 如果结果已经定义,大多数语言在评估逻辑表达式时会执行快捷方式,包括。 PHP;然而,最常见的例外是反向抛光表示法语言,如PostScript。