【问题标题】:understand operator precedence了解运算符优先级
【发布时间】:2014-09-09 22:00:24
【问题描述】:

正在修复我们代码中的错误,并发现了这个行为不端的奇怪函数:

private String calculate(String a, String b) {
    return a == null ? "" : a + a != null && b != null ? "\n" : "" + b == null ? "" : b;
}

匆忙中,我只是添加了一些括号让它像这样工作:

private String calculatePar(String a, String b) {
    return a == null ? "" : a + (a != null && b != null ? "\n" : "") + (b == null ? "" : b);
}

顺便说一句,这不是最优雅的做法,但实际上两者都来自我为解决问题而编写的(简化的)测试用例示例。

现在我对有问题的第一个功能进行了一些测试,这就是我的想法:

  • 如果a==null,它将返回“”(空字符串)
  • 如果 a!=null 和 b == null 它将返回 null
  • 否则(如果 a 和 b 不为空),它将返回“\n”

现在有个大问题:这是怎么发生的?我的意思是编译器很可能没有按照原始开发人员的意图放置自己的括号,但是你怎么能得到 null 呢?

【问题讨论】:

  • 我看到问题已迁移,您得到了答案;优秀!以后请记住,这是提出此类问题的最佳场所,而不是Code Review

标签: java string conditional-statements ternary-operator


【解决方案1】:

这更多的是运算符优先级而不是连接。没有括号,编译器使用Operator Precedence table 来判断评估顺序。 + 比比较具有更高的优先级,因此语句被评估为

return a == null 
       ? "" 
       : (a + a != null && b != null) 
            ? "\n" 
            : ("" + b == null) 
                ? "" 
                : b;

注意:我总是将嵌套的三元运算符语句缩进以帮助理解。

第 1 步:
一个 == 空 返回“”

第 2 步:
a != null

检查 (a + a != null && b != null)

(a+a != null) 总是正确的,所以我们真的在测试 b!= null

b!= 空,

返回“\n”

第 3 步:

如果 b == null

检查 ("" + b == null)

"" + b (null) 永远不会等于 null;总是假的

所以,返回b,它是空的。

【讨论】:

  • 非常感谢,我已经编辑了标题以供进一步参考;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 2018-04-12
相关资源
最近更新 更多