Java中的逻辑运算符优先级

2023-12-13

我对此并不满意:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22。它明确规定了以下内容:

“如果操作数表达式没有副作用,则每个运算符都是可交换的。”

and

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

为什么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

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


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

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

This

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

变得等于

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

这就是所有的优先级。

正如 Java 语言规范所说,运算符操作数从左到右计算。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中的逻辑运算符优先级 的相关文章

随机推荐