【发布时间】:2014-02-04 15:54:03
【问题描述】:
我对此不满意: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
一些解释会很好解释为什么这没有正确实现。即使在第二部分周围添加括号,也不会使用正确的优先级。
【问题讨论】:
-
有什么问题?您的结果匹配,它们只是乱序。
-
这些不是逻辑运算符,而是位运算符。
-
根据官方java规范,根据周围的数据,它们被称为逻辑运算符和位运算符。同时 && 和 ||被称为条件与/条件或运算符。对于您如何称呼它们的问题,这甚至无关紧要。我建议你看看链接的规范。
-
@trevor-e 问题是,当我的代码有副作用时(我在这里用一个简单的 sout 调用演示了这一点),我不能依赖官方的 java 规范是正确的。我正在寻求解释。
-
@user2890248 “运算符优先级”与表达式的解释方式有关;它只是意味着
a | b & c等价于a | (b & c)而不是(a | b) & c。它与运行时评估部件的顺序无关。不幸的是,我打算向您指出一个解释“运算符优先级”的资源,但维基百科页面的第一句话实际上混淆了这个问题。我可能不得不抱怨这一点。
标签: java