为什么在三元组之前“评估”Java三元组?

时间:2013-07-09 13:09:32

标签: java

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

assertTrue(true || false ? false : false);

为了这篇文章(它最初使用的是字符串比较),语句已被愚蠢了,我知道它可以简化为不使用三元运算符,但基本上我试图找出为什么Java会评估它是这样的:

(true || false) ? false : false

而不是:

true || (false ? false : false)

我希望它能评估 true 并退出。有谁知道它为什么没有?

4 个答案:

答案 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;