我对此不满意: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
一些关于为什么未正确实施的解释会很好。即使在第二部分周围加上括号,也不会使用正确的优先级。
“这些运算符具有不同的优先级,&的优先级最高,|的优先级最低”。
仅仅因为它们具有更高的优先级,并不意味着它们的操作数将首先被评估。
这个
boolean bool = isTrue1() | isFalse1() & isFalse2() ;
等于
boolean bool = isTrue1() | ( isFalse1() & isFalse2() ) ;
那是所有优先事项。
正如Java语言规范所说,运算符操作数是从左到右求值的。
Java编程语言保证运算符的操作数似乎按照特定的评估顺序(即从左到右)进行评估。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句