java - 了解运算符优先级

标签 java string conditional-statements ternary-operator

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

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);
}

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

现在我对 buggy first 函数进行了一些测试,这是我的想法:

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

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

最佳答案

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

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

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

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

第 2 步:
一个 != null

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

(a+a != null) 始终为真,所以我们真的在测试 b!= null

b!= null,

返回“\n”

第 3 步:

如果 b == null

检查 (""+ b == null)

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

因此,返回 b,它是 null。

关于java - 了解运算符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24830513/

相关文章:

java - 嵌入式数据库和加密

java - Java线程对象如何调用原始类的方法?

java - 意外的碧 Jade 异常

c - 数组中的字符串到另一个数组中

java - Java if 语句什么时候退出?

java - 获取休息错误 415

c - 为什么 "a"!= "a"在 C 中?

c++ - 如何将一些字符复制到 C++ 中的字符串中

python - 如何根据多个条件(包括 'isnull' 、 'or' 和 if colB 'isin' colA 等语句)创建新的 pandas 列?

c++ - 如何使用条件语句返回指针?