如何评估Java中的三元表达式?

时间:2017-06-18 11:15:47

标签: java conditional ternary-operator

我已按照教程提供here并排成一行:

{{ Error["motherboard"]["socketError"] }}

t1的最终值为false。但我认为它是真的。 first false给出了true,而true给出了false,这最终给出了真实 我对吗?不,我错了。 请告诉我如何在java中评估三元表达式?

3 个答案:

答案 0 :(得分:5)

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

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

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

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

             first     second        third
             operand   operand       operand

由于第一个操作数为false,结果是第三个操作数true?false:true?false:true的值,所以让我们评估它:

true    ?   false    : true?false:true;

first       second     third
operand     operand    operand

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

顺便说一句,第三个操作数true?false:true的值也是false,因此无论x?false:true?false:true的值如何,x都会返回false。

答案 1 :(得分:4)

我们可以根据相关性规则重新组合这些操作。

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
  4. 现在,为了获得技术,这就是实际发生的事情:

    1. Exp 3是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

答案 2 :(得分:1)

下面的伪代码显示了如何评估表达式:

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;