Java 多三元运算符

Posted

技术标签:

【中文标题】Java 多三元运算符【英文标题】:Java Multiple Ternary operators 【发布时间】:2014-04-04 18:18:02 【问题描述】:

我目前正在学习一些 Java,我遇到了以下代码。我了解典型的三元运算符(例如下面以“boolean a”开头的行),但我不明白如何阅读以“boolean b”开头的行上的表达式。任何有关如何阅读此行的帮助将不胜感激!谢谢!

public class Ternary
    public static void main (String[] args)
        int x = 10;
        int i = 2;
        boolean a = x > 10 ? true: false;
        boolean b = a = true ? ++i > 2 ? true:false:false;
        System.out.print(b);
    

【问题讨论】:

查看运算符优先级的详细信息:docs.oracle.com/javase/tutorial/java/nutsandbolts/…。我对你有感觉——代码很深奥。 三元运算符具有以下格式(条件?条件为真时的结果:条件为假时的结果)。所以在这里,我们定义布尔值a,然后将它赋值给三元运算符的结果。 【参考方案1】:

这样分解:

true ? (++i > 2 ? true 
                : false)
     : false;

所以这里的测试条件总是设置为true。所以执行的三元的分支是++i > 2 ? true : false 部分。

这只是检查增加后i 是否大于2。如果是这样,它将返回true。否则它将返回false

整个表达式实际上是不必要的复杂。可以简单地写成这样:

boolean b = a = (++ i > 2);

但是,代码可能在逻辑上不正确,因为这个深奥的表达没有那么大的意义。由于上一行设置了a 的值,我假设下一行实际上打算测试a。所以实际意图可能是:

boolean b = a == true ? ++i > 2 ? true : false : false; //notice the ==

在这种情况下,您可以将其分解为:

(a == true) ? (++i > 2 ? true
                       : false)
            : false;

但是您实际上不需要执行a == true,因为a 已经是boolean,所以您可以这样做:

a ? (++i > 2 ? true
             : false)
  : false;

在这里,它检查a 是否为true。如果是,则执行我们已经检查过的检查(即查看i 的增量值是否大于2),否则返回false

但即使是这个复杂的表达式也可以简化为:

boolean b = a && (++i > 2);

【讨论】:

最后一个假的呢?它会做一个真值表 T v F = T 吗? 最后一个false 在这种情况下永远不会被评估,因为测试总是true 感谢您的解释 Vivin(以及其他所有人)。该代码实际上来自一个示例 OCJA 考试,这可能解释了为什么它写得如此不必要的复杂。再次感谢! 大声笑,现在我在已删除的问题上得到了 -3,因为我是第一个提到 b = a = true 的人不正确。并在 Rohit Jain 的回答下方查看您的评论.. @Zefnus 我的意思是“正确”,因为代码会编译。但是,是的,这真的没有意义。【参考方案2】:

boolean b = a = true ? ++i > 2 ? true:false:false; 中发生以下情况:

a = true

这将赋予a true 值并评估为true

然后我们从++i > 2 ? true:false 得到另一个条件++i > 2,在这种情况下也是如此。结果将是true

【讨论】:

【参考方案3】:

啊!永远不要写那样的代码。但我会假设这不是你写的。但你可以这样读:

// I assume that's `a == true` instead of `a = true`
boolean b = a == true ? (++i > 2 ? true : false)
                      : false;

可以进一步分解为:

// a == true is better written as just `a`. You shouldn't do boolean comparison
// like that.
boolean b = a ? (++i > 2) : false;

// If that is really a = true, then you can break it as:
boolean b = a = true ? (++i > 2) : false;

可以进一步细分为:

// If that is `a == true`
boolean b = a && (++i > 2)

// If that is really a = true, then you can break it as:
boolean b = a = (++i > 2);

还有,第一个作业:

boolean a = x > 10 ? true: false;

也可以写成:

boolean a = x > 10;

【讨论】:

我不认为这是正确的。 boolean b = a = true 是正确的;它只是将结果分配给ab a == true 不太好,但它不会将 true 分配给 a。 仅供参考,IntelliJ 将其简化为 boolean b = a = ++i > 2; @VivinPaliath 更新了该案例的答案,但我怀疑这确实是这个意思。在那种情况下,那将是奇怪的代码。 @GáborBakos 我知道a == true 不太好。请查看我的更新答案。【参考方案4】:

三元运算符

条件判断为真或假

条件始终为真(因为 a 等于真)。

那么结果为真,因为 ++i 大于 2(它是 3)。

因此,它将 true 分配给 b。如果条件为假,它将分配为假。该 false 将从最后一个 false 分配。

【讨论】:

【参考方案5】:

如果您可以使用 括号 并按如下方式查看该代码,将会有所帮助;

boolean b = a = (true ? (++i > 2 ? true : false) : false);

你可以这样想:

if (true) // # If Number:1

    if (++i > 2) // # If Number:2
    
        a = true;            
    
    else  a = false; 

else  a = false; 

其中if(true) 是Tautology 并且If Number:2 将始终被执行。所以;它变成了;

if (++i > 2)

    a = true;            

else  a = false; 

可以评估为; a = (++i > 2) ? true : false); 变成:a = ++i > 2 结果 b = a 就是 ++i > 2

【讨论】:

【参考方案6】:

可怕的代码!

有一些线索表明b = a = true ? ... 应该是b = a == true ? ...,否则前一行是一个无用的赋值(a 永远不会被读取),并且该行的最后一个false 成为无法访问的代码。编译器会告诉你的。

我会假设一个更正的== 来回答 - 但你会知道这是你的错字、不可靠的来源还是“发现错误”测试,并且能够使用相同的任何你喜欢的代码的技术。

诀窍是逐步重构它。首先根据优先规则添加括号和缩进。

 b = a == true ? ++i > 2 ? true:false:false;
 ... becomes ...
 b = (a == true) 
          ? (++i > 2 ? true:false)
          :false;

接下来注意:

a == true 等同于 aboolean x = a ? true : false; 等价于 boolean x = a

因此:

 b = a
     ? (++i > 2)
     :false;

或:

 b = a && ( ++i > 2 );

如果这是“严重”代码,解决此问题的方法是编写一组涵盖所有可能输入情况的单元测试。然后一次一个地进行这些重构,每次都重新运行测试以确保您没有改变代码的行为。

请注意,简化形式中没有 truefalse 文字。在三元运算中看到布尔文字——或者实际上是布尔值的三元表达式——是一种代码味道,因为非三元版本通常更简单、更清晰。

三元表达式对其预期目的非常有用,即将布尔条件映射到非布尔输出:

 shippingPrice = orderTotal >= freeShippingThreshold ? 0 : getStandardShipping();

【讨论】:

【参考方案7】:

对正在尝试的内容进行了一些猜测,并对变量进行了一些重命名,并假设 a = true 应该是 a == true,你会得到:

    boolean failed = result > 10 ? true: false;
    boolean b = failed ? ++retries > 2 ? true:false:false;

然后可以将其整理成更合乎逻辑的:

    boolean failed = result > 10;
    boolean giveUp = failed && ++retries > 2;

【讨论】:

【参考方案8】:
boolean nu = f=='f' && t=='f'; //0
boolean ei = f=='f' && t=='t'; //1
boolean zw = f=='t' && t=='f'; //2
boolean dr = f=='t' && t=='t'; //3
System.out.println( nu ? 0 : ei ? 1 : zw ? 2 : dr ? 3 : "invalid");

【讨论】:

以上是关于Java 多三元运算符的主要内容,如果未能解决你的问题,请参考以下文章

三元运算符 Java

Java第二周总结

Java三元运算符语法[重复]

从0开始学大数据-Java基础-三元运算符/键盘录入

如何使用 Java Optional 优雅地替换三元运算符

JAVA-初步认识-第三章-三元运算符