正在修复我们代码中的错误并发现这个行为异常的奇怪函数:
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/