一直以来,我对短路评估的想法似乎都是错误的。
在 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似乎是这样的)?