【问题标题】:How are ternary expressions in Java evaluated?Java中的三元表达式是如何计算的?
【发布时间】:2017-11-20 17:10:53
【问题描述】:

我已按照教程提供here 并在线:

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

t1 的最终值为 false。但我认为它是真的。 第一个假给真,真给假,最后给真 我对吗?不,我错了。 请告诉我如何在 java 中评估三元表达式?

【问题讨论】:

  • 您的代码可以简化为boolean t1 = !false && (true ? false : true ? false : true);,始终为false。
  • 尝试使用方括号/圆括号让您的生活更轻松。

标签: java conditional ternary-operator


【解决方案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;

【讨论】:

    【解决方案2】:

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

    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 是 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。

    【讨论】:

    • 实际上,您在“Exp 1”中表示的内容根本不会被评估。这是死代码。
    • @Eran 对于 Java 初学者,我尽量不要太技术化。但我想值得一提的是。已更新。
    【解决方案3】:

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

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

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

    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的值如何,x?false:true?false:true都会返回false。

    【讨论】:

    • 对不起,请告诉我操作数是如何分隔的?即实际上第一个第二个和第三个操作数是什么。我是java语言的初学者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多