4

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

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

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

(true || false) ? false : false

而不是这个:

true || (false ? false : false)

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

4

4 回答 4

15

Because of operator precedence. Logical AND and Logical OR have higher precedence than the ternary operator, so they act first.

于 2013-07-09T13:11:38.890 回答
11

Because || has higher precedence than ?:. Here's a table of operators in Java. The || has position 13 while ?: is on position 14.

于 2013-07-09T13:11:30.027 回答
5

因为这就是语言规范所说的。语法的相关位是

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必须是 an Expression1Rest,并且 a 的右侧||必须是 an Expression3,它不包括三元条件表达式(除非它被括在括号中 - 带括号的表达式总是可以接受为 an Expression3)。因此,我们必须将 解析A || BExpression3,从而将整个表达式解析为(A || B) ? C : D

于 2013-07-09T13:23:16.860 回答
2

所以,有一种叫做“运算符优先级”的东西。这与数学中的运算顺序概念相同。就像数学+在后面一样*,Java?:在后面||

为什么会这样?好吧,我认为将 ternary 扩展为if语句会有所帮助:

true || false? false: false;
// literally maps to
if(true || false) false; else true;
于 2013-07-09T13:13:01.490 回答