我对此非常不满:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22。它明确指出:
结果如下:
"如果操作数表达式没有副作用,则每个运算符都是可交换的。"
和
"这些操作符具有不同的优先级,其中&的优先级最高,|的优先级最低。"
那么JVM为什么不遵守自己的规定呢?以以下示例为例。
public static void main(String[] args){
boolean bool = isTrue1() | isFalse1() & isFalse2() ;
System.out.println("Result : " + bool);
}
public static boolean isFalse1() {
System.out.println("1 : " + false);
return false ;
}
public static boolean isFalse2() {
System.out.println("2 : " + false);
return false ;
}
public static boolean isTrue1() {
System.out.println("3 : " + true);
return true ;
}
结果如下:
3 : true
1 : false
2 : false
Result : true
根据 & 运算符比 | 运算符具有优先级的事实,实际结果应该是:
1 : false
2 : false
3 : true
Result : true
希望解释一下为什么这个实现不正确。即使在第二部分周围添加括号,也没有使用正确的优先级。
a | b & c
等同于a | (b & c)
而不是(a | b) & c
。它与运行时部分的评估顺序无关。不幸的是,我本来想给你指出一份解释“运算符优先级”的资源,但维基百科页面的第一句话实际上让问题更加混淆了。我可能要对此提出抱怨。 - ajb||
和&&
是短路运算符,而|
和&
则不是。 - Simon Forsberg