Java 中的三元表达式如何求值?

How are ternary expressions in Java evaluated?

我已按照教程提供 here 并符合:

boolean t1 = false?false:true?false:true?false:true;

t1 的最终值为 false。但我评价它是真的。 第一个 false 给出 true,那个 true 给出 false,最后给出 true 我对吗?不,我错了。 请告诉我如何在 java?

中评估三元表达式

当编译器找到 ? 字符时,它会查找对应的 :?前的表达式是三元条件运算符的第一个操作数,表示条件

?:之间的表达式是运算符的第二个操作数,如果条件为真则返回其值。

:后面的表达式是运算符的第三个操作数,如果条件为假则返回其值。

boolean t1 = false   ? false    :    true?false:true?false:true;

             first     second        third
             operand   operand       operand

由于第一个操作数为假,结果是第三个操作数的值true?false:true?false:true,所以我们来计算一下:

true    ?   false    : true?false:true;

first       second     third
operand     operand    operand

由于第一个操作数为真,结果为第二个操作数的值 - false.

顺便说一句,第三个操作数 true?false:true 的值也是 false,所以 x?false:true?false:true returns false 不管 x 的值如何。

我们可以根据结合性规则对这些操作进行重组。

boolean t1 = (false ? false : (true ? false : (true ? false : true)));
                  |                      |               | 
                  |                      |               1
                  |                      2
                  3

理论上,这是应该发生的事情

  1. Exp 1 首先求值,求值为 false
  2. Exp 2 现在是:true? false : false 所以最终输出是 false
  3. Exp 3 现在变为 false ? false : false,即 false

现在,为了获得技术性,这就是实际发生的事情:

  1. Exp 3 is false ? (don't care) : (...) -> 需要计算包含 Exp 2 和 Exp 1 的内部表达式。
  2. Exp 2 是 true: false, (don't care) 由于我们已经确定了 Exp 2 的值,因此不再需要计算 Exp 1。
  3. Exp 3 现在重新计算为 false ? (don't care) : false,因此最终答案是 false

下面的伪代码显示了如何计算表达式:

boolean t1 = false?false:true?false:true?false:true              
           = true && (true ? false : true ? false : true)
           = true && false
           = false

另一种看待它的方式:

boolean t1 = false?false:true?false:true?false:true;

可以简化为:

boolean t1 = !false && (true ? false : true ? false : true); 

然后简化为:

boolean t1 = true && (true ? false : true ? false : true); 

然后简化为:

boolean t1 = true && false;

最终导致 false;