我有以下Java代码片段,当我希望它返回 true 时返回 false :
assertTrue(true || false ? false : false);
为了这篇文章(它最初使用的是字符串比较),语句已被愚蠢了,我知道它可以简化为不使用三元运算符,但基本上我试图找出为什么Java会评估它是这样的:
(true || false) ? false : false
而不是:
true || (false ? false : false)
我希望它能评估 true 并退出。有谁知道它为什么没有?
答案 0 :(得分:15)
因为operator precedence。逻辑AND和逻辑OR的优先级高于三元运算符,因此它们首先起作用。
答案 1 :(得分:11)
因为||
的优先级高于?:
。这是一个table of operators in Java。 ||
位置为13,?:
位于第14位。
答案 2 :(得分:5)
因为那是language specification所说的。语法的相关位是
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
必须是Expression1Rest
,而||
的右侧必须是Expression3
, not 包含一个三元条件表达式(除非它包含在括号中 - 带括号的表达式总是可以接受为Expression3
)。因此,我们必须将A || B
解析为Expression3
,从而将整个表达式解析为(A || B) ? C : D
。
答案 3 :(得分:2)
所以,有一种叫做“operator precedence”的东西。它与数学中的操作顺序概念相同。就像数学+
在*
之后,在?:
中||
之后。{/ p>
为什么是这样的?好吧,我认为将三元扩展到if
语句是有帮助的:
true || false? false: false;
// literally maps to
if(true || false) false; else true;