Java中的逻辑运算符优先级

时间:2014-02-04 15:54:03

标签: java

我对此并不满意: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

为什么没有正确实现这一点会有一些解释。即使在第二部分周围添加括号,也不会使用正确的优先级。

5 个答案:

答案 0 :(得分:8)

  

“这些运算符具有不同的优先级,其中&具有最高优先级   优先级和|最低优先级“。

仅仅因为它们具有更高的优先级,并不意味着它们的操作数将首先被评估。

boolean bool = isTrue1() | isFalse1() & isFalse2() ;

等同于

boolean bool = isTrue1() | ( isFalse1() & isFalse2() ) ;

这都是优先权。

正如Java语言规范所说,operator operands are evaluated left to right.

  

Java编程语言保证了操作数   运算符似乎在特定的评估顺序中进行评估,   即,从左到右。

答案 1 :(得分:3)

&优先级高于|但在你的情况下,评估这个:

boolean bool = isTrue1() | isFalse1() & isFalse2()

与评估此相同:

  boolean bool = (isTrue1()) | (isFalse1() & isFalse2())

这意味着,|的两面表达式是相同的优先级。因此,在这种情况下,java将以从左到右的顺序对它们进行评估。

首先它将调用isTrue1(),它是左边的第一个,然后是第二个paranthesis,再次按从左到右的顺序评估其中的内容:isFalse1()然后是isFalse2()。

答案 2 :(得分:1)

方法评估的顺序不一定与运算符优先级匹配;每种方法的副作用都按照您调用方法的顺序出现,然后评估它们的结果以生成最终的print语句。

答案 3 :(得分:0)

您在这里做的是按位组合,而不是逻辑操作。所以Java按照人们的预期遵循从左到右的顺序。

如果您实际使用逻辑操作(替换| with ||和& with&&),结果将变为:

1 : true
Result : true

答案 4 :(得分:-2)

Java会在比较结果之前调用所有函数,因为你使用的是二进制比较器(&和|)而不是逻辑比较器(&&和||)

相关问题