【问题标题】:String concatenation does not work properly in Java when concatenating 2 results of ternary operators连接三元运算符的 2 个结果时,字符串连接在 Java 中无法正常工作
【发布时间】:2014-04-02 17:54:16
【问题描述】:

尊敬的 Java 大师!

请您解释一下,为什么在连接三元运算符的 2 个结果时,字符串连接在 Java 中不能正常工作?

例子:

String str = null;
String x = str != null ? "A" : "B" + str == null ? "C" : "D";
System.out.println(x);

输出是“D”,但我期望的是“BC”。

我怀疑由于操作员的优先级,它会像这样工作,但我不确定我们如何在上述情况下得到“D”。这种情况采用什么计算算法?

【问题讨论】:

  • 优先级不是你所期望的。如有疑问,请添加括号。
  • 我觉得这是三元组降低可读性的情况。
  • 是的,我同意。我目前正在指导适当的issue in Checkstyle sandbox。在这个问题中,我们希望让其他人通过使用 Checkstyle 来防止在他们的代码中出现这种不可读的基于三元的表达式
  • 事实上,像这样的代码给三元组带来了不好的名声,让人们想出像“永远不要使用三元运算符”这样的过于宽泛的规则。
  • 为什么从来没有?我认为最好让人们决定每个表达式可以允许多少三元数

标签: java operator-keyword ternary


【解决方案1】:

问题可能是操作的顺序。您可以通过写作使其明确:

String x = (str != null ? "A" : "B") + (str == null ? "C" : "D");

【讨论】:

    【解决方案2】:

    我想你是故意的

    String x = (str != null ? "A" : "B") + (str == null ? "C" : "D");
    

    【讨论】:

      【解决方案3】:

      "B" + str == null ? "C",在条件表达式评估之前首先评估字符串连接

      【讨论】:

        【解决方案4】:

        解释为如下代码:

        String x = str != null ? "A" : ("B" + str == null ? "C" : "D");
        

        "B" + str 不为空,因此它将被评估为"D"

        在 OSborn 的回答的帮助下,您可以使用此代码执行您所期望的操作:

        String x = (str != null ? "A" : "B") + (str == null ? "C" : "D");
        

        由于您只是比较 strnull 并且两个条件语句几乎相同,因此可以将其缩短为:

         String x = (str != null ? "AD" : "BC");
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-21
        • 2021-02-06
        • 2019-01-09
        • 2020-07-23
        • 2015-06-09
        • 2019-11-18
        相关资源
        最近更新 更多