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