Java中的三元表达式是如何计算的?

Java中的三元表达式是如何计算的?,java,conditional,ternary-operator,Java,Conditional,Ternary Operator,我已按照教程提供并符合以下要求: boolean t1 = false?false:true?false:true?false:true; t1的最终值为false。但我认为这是真的。 首先是假,然后是真,最后是真 我说得对吗?不,我错了。 请告诉我如何在java中计算三元表达式?当编译器找到一个?字符时,它会查找相应的:。?前面的表达式是表示条件的三元条件运算符的第一个操作数 ?和:之间的表达式是运算符的第二个操作数,如果条件为真,则返回其值 :后面的表达式是运算符的第三个操作数,如果条件为

我已按照教程提供并符合以下要求:

boolean t1 = false?false:true?false:true?false:true;
t1的最终值为false。但我认为这是真的。 首先是假,然后是真,最后是真 我说得对吗?不,我错了。
请告诉我如何在java中计算三元表达式?

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

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

后面的表达式是运算符的第三个操作数,如果条件为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
返回false,而不管
x
的值是多少,我们都可以根据关联性规则重新组合这些操作

boolean t1 = (false ? false : (true ? false : (true ? false : true)));
                  |                      |               | 
                  |                      |               1
                  |                      2
                  3
理论上,这是应该发生的事情

  • Exp 1首先计算,计算结果为
    false
  • Exp 2现在是:
    true?false:false
    因此最终输出为
    false
  • Exp 3现在变为
    false?false:false
    ,即
    false

  • 现在,从技术上讲,这就是实际发生的情况:

  • Exp 3是否<代码>错误?(不在乎):(…)->需要计算包含Exp 2和Exp 1的内部表达式
  • Exp 2是
    true:false(不在乎)
    因为我们已经确定了Exp 2的值,Exp 1不再需要计算
  • Exp 3现在重新评估为
    false?(不在乎):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;
    
    然后简化为:

    boolean t1 = !false && (true ? false : true ? false : true); 
    
    boolean t1 = true && (true ? false : true ? false : true); 
    
    boolean t1 = true && false;
    
    然后简化为:

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

    最终导致
    错误

    您的代码可以简化为
    booleant1=!假&(真?假:真?假:真)
    始终为
    false
    。请尝试使用括号/括号来简化此操作。对不起,请告诉我操作数是如何分隔的?i、 第一、第二和第三个操作数是什么。我是java语言的初学者。实际上,您在“Exp 1”中表示的内容根本没有经过计算。这是一段死代码。@Eran我试图对java初学者来说不要太过技术化。但我想这一点很重要。更新。