Java';s逻辑OR运算符不计算右侧,尽管右侧有一元运算符?

Java';s逻辑OR运算符不计算右侧,尽管右侧有一元运算符?,java,operator-precedence,unary-operator,logical-or,Java,Operator Precedence,Unary Operator,Logical Or,鉴于: Object x = null; 考虑代码片段#1: 代码片段#1没有像我最初认为的那样抛出NullPointerException。我可以在|操作员的帮助下引发异常。代码片段#2: 那么,为什么我的第一个代码段从未计算过包含一元NOT运算符的正确表达式(感叹号!)?根据。。那么所有的网站都在那里。。一元NOT运算符的优先级高于逻辑OR运算符(|)。中对此进行了解释。如果第一个布尔表达式分别导致true或false,则|和&短路执行 一元的优先级高于按位或|。有关优先规则,请参阅。中对

鉴于:

Object x = null;
考虑代码片段#1:

代码片段#1没有像我最初认为的那样抛出NullPointerException。我可以在
|
操作员的帮助下引发异常。代码片段#2:

那么,为什么我的第一个代码段从未计算过包含一元NOT运算符的正确表达式(感叹号
)?根据。。那么所有的网站都在那里。。一元NOT运算符的优先级高于逻辑OR运算符(
|
)。

中对此进行了解释。如果第一个布尔表达式分别导致
true
false
,则
|
&
短路执行

一元
的优先级高于按位或
|
。有关优先规则,请参阅。

中对此进行了解释。如果第一个布尔表达式分别导致
true
false
,则
|
&
短路执行

一元
的优先级高于按位或
|
。有关优先规则,请参见。

请仔细阅读-在逻辑OR语句(
|
)中,仅当第一个参数为false时,才计算第二个参数

使用第二个运算符(a,
|
),两个参数都将被计算(它不会短路)。因此,由于
x
为空,第二个参数将抛出
NullPointerException
,而第一个参数不会抛出。

请仔细阅读-在逻辑OR语句(
|
)中,只有当第一个参数为假时,才计算第二个参数

使用第二个运算符(a,
|
),两个参数都将被计算(它不会短路)。因此,因为
x
为空,第二个将抛出
NullPointerException
,而第一个不会抛出。

如果Java在这方面与C类似,那么像
|
&
这样的逻辑运算符将从左到右求值。根据定义,如果
p==true
,那么
p或q==true
,因此计算
的右侧是没有意义的

这样就不必做这样的事情(当然,这比计算一堆冗余表达式更有效):

我不确定优先级在这里有多重要,因为
not
排除了提供的条件中的第一个表达式,所以右手的值与左手的值没有任何关系。

如果Java在这方面与C类似,像
|
&&
这样的逻辑运算符从左到右求值。根据定义,如果
p==true
,那么
p或q==true
,因此计算
的右侧是没有意义的

这样就不必做这样的事情(当然,这比计算一堆冗余表达式更有效):

我不确定这里的优先级有多重要,因为
not
排除了提供的条件中的第一个表达式,所以右手的值与左手的值没有任何关系

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

是的,这是真的。但是,如果不在逻辑OR的第一个表达式上使用,则优先级的事情将生效

考虑以下条件:

if (!x.equals(y) || y.equals(z))
在这种情况下,在逻辑OR之前,先对
x.equals(y)
的结果应用否定。那么,
|
的优先级是否大于
,则表达式的计算结果为:

if (!(x.equals(y) || y.equals(z)))
但事实并非如此。你知道为什么

但是,如果NOT运算符位于第二个表达式上,则此处的优先级不是一个点。第一个表达式总是在第二个表达式之前先求值。短路行为将发挥作用

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

是的,这是真的。但是,如果不在逻辑OR的第一个表达式上使用,则优先级的事情将生效

考虑以下条件:

if (!x.equals(y) || y.equals(z))
在这种情况下,在逻辑OR之前,先对
x.equals(y)
的结果应用否定。那么,
|
的优先级是否大于
,则表达式的计算结果为:

if (!(x.equals(y) || y.equals(z)))
但事实并非如此。你知道为什么


但是,如果NOT运算符位于第二个表达式上,则此处的优先级不是一个点。第一个表达式总是在第二个表达式之前先求值。短路行为也会起作用。

通常的误解是优先级==评估顺序。情况并非总是如此。优先级决定编译器构建表达式的顺序,这可能导致生成的代码与该顺序匹配,但在某些情况下,例如,增量后运算符和短curcuit运算符,这不适用

所有优先权均指隐含括号所在的位置,例如

if (x == null || !x.equals(new Object()))

if ((x == null) || (!(x.equals(new Object()))))

一个常见的误解是优先级==求值顺序。情况并非总是如此。优先级决定编译器构建表达式的顺序,这可能导致生成的代码与该顺序匹配,但在某些情况下,例如,增量后运算符和短curcuit运算符,这不适用

所有优先权均指隐含括号所在的位置,例如

if (x == null || !x.equals(new Object()))

if ((x == null) || (!(x.equals(new Object()))))

因为如果
中的第一个条件为真,那么计算第二个条件的意义是什么?是的,我知道,问题是一元NOT运算符(!)具有更高的优先级,应该在OR运算符之前计算。至少我是这么想的!因为如果
中的第一个条件是tr