为什么Java是三元的;“评估”;在手术室之前?

为什么Java是三元的;“评估”;在手术室之前?,java,Java,我有以下Java代码片段,当我希望它返回true时,它返回false: 为了这篇文章,该语句被简化了(它最初使用字符串比较),我知道它可以简化为不使用三元运算符,但基本上我想弄清楚为什么Java会这样计算它: (true || false) ? false : false 与此相反: true || (false ? false : false) 我希望它能够评估真实情况并退出。有人知道为什么没有吗?因为|的优先级高于?:。这是一个例子。|位于位置13,而?:位于位置14。因为。逻辑AND和

我有以下Java代码片段,当我希望它返回true时,它返回false:

为了这篇文章,该语句被简化了(它最初使用字符串比较),我知道它可以简化为不使用三元运算符,但基本上我想弄清楚为什么Java会这样计算它:

(true || false) ? false : false
与此相反:

true || (false ? false : false)

我希望它能够评估真实情况并退出。有人知道为什么没有吗?

因为
|
的优先级高于
?:
。这是一个例子。
|
位于位置13,而
?:
位于位置14。

因为。逻辑AND和逻辑OR的优先级高于三元运算符,因此它们首先起作用。

因此,有一种称为“”。这和数学中的运算顺序是一样的。就像在数学中,
+
*
之后一样,在Java中,
?:
|
之后

为什么会这样?我认为,如果语句:

,将三进制扩展为<代码>是有帮助的。
true || false? false: false;
// literally maps to
if(true || false) false; else true;
因为那是警察说的。语法的相关部分是

Expression: 
     Expression1 [AssignmentOperator Expression1]

Expression1: 
     Expression2 [Expression1Rest]

Expression1Rest: 
     ? Expression : Expression1

Expression2:
     Expression3 [Expression2Rest]

Expression2Rest:
     { InfixOp Expression3 }
     instanceof Type


InfixOp: 
     || 
     &&
     // and many other operators

那么要解析
A | | B?C:D
?C:D
必须是
表达式1最接近的
|
的右侧必须是
表达式3
,它不包括三元条件表达式(除非用括号括起来-括号内的表达式始终可以作为
表达式3
)。因此,我们必须将
A | | B
解析为
表达式3
,从而将整个表达式解析为
(A | | B)?C:D

运算符优先级:这就是为什么总是使用括号的原因。标题不应该是“在an之后”还是“更确切地说”在or之前?我认为我的帖子不是很清楚。我只是想知道为什么它不能返回真值。也许我的例子不清楚。这难道不意味着当or求值时,它将返回true吗?基本上,运算符优先级就像一组隐式括号。因为
| |
高于
?:
真| |假?false:false
等同于
(true | false)?false:false
。但请注意,这不是Java独有的。每种带有中缀运算符的编程语言都有运算符优先级。即使是数学也有运算符优先。谢谢,其他答案很有帮助,但这正是我要找的答案。
Expression: 
     Expression1 [AssignmentOperator Expression1]

Expression1: 
     Expression2 [Expression1Rest]

Expression1Rest: 
     ? Expression : Expression1

Expression2:
     Expression3 [Expression2Rest]

Expression2Rest:
     { InfixOp Expression3 }
     instanceof Type


InfixOp: 
     || 
     &&
     // and many other operators