我对此并不满意: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编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右.