Java的逻辑OR运算符不评估右侧,尽管右侧有一元运算符?

Mar*_*son 1 java operator-precedence unary-operator logical-or

鉴于:

Object x = null;
Run Code Online (Sandbox Code Playgroud)

考虑代码片段#1:

if (x == null || !x.equals(new Object()))
    System.out.println("I print!");
Run Code Online (Sandbox Code Playgroud)

代码片段#1并没有NullPointerException像我原先认为的那样抛出.我可以通过|运营商的一些帮助激起例外.代码段#2:

if (x == null | !x.equals(new Object()))
    System.out.println("This will throw a NullPointerException..");
Run Code Online (Sandbox Code Playgroud)

那么为什么我的第一个代码片段从未评估过具有一元NOT运算符的正确表达式(感叹号!)?根据..那里所有的网站..一元NOT运算符的优先级高于逻辑OR运算符(||)的优先级.

Roh*_*ain 7

一元NOT运算符的优先级高于逻辑OR运算符(||)的优先级.

对,是真的.但是,如果在逻辑OR的第一个表达式上使用NOT,则优先级将生效.

考虑条件:

if (!x.equals(y) || y.equals(z))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,否定将首先应用于x.equals(y)逻辑OR之前的结果.因此,如果优先级||大于!,那么表达式将被评估为:

if (!(x.equals(y) || y.equals(z)))
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.如你所知.

但是,如果NOT运算符在第二个表达式上,则优先级不是此处的一个点.第一个表达式将始终在第二个表达式之前首先计算.并且短路行为将发挥作用.