首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解运算符优先

问理解运算符优先
EN

Stack Overflow用户
提问于 2014-07-18 13:05:53
回答 1查看 81关注 0票数 1

修复我们代码中的错误,发现这个奇怪的函数行为不当:

代码语言:javascript
复制
private String calculate(String a, String b) {
    return a == null ? "" : a + a != null && b != null ? "\n" : "" + b == null ? "" : b;
}

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

代码语言:javascript
复制
private String calculatePar(String a, String b) {
    return a == null ? "" : a + (a != null && b != null ? "\n" : "") + (b == null ? "" : b);
}

顺便说一句,这并不是最优雅的做法,但这两种方法实际上都是从我编写的(简化)测试用例中找到的。

现在,我对buggy的第一个功能做了一些测试,下面是我所想的:

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-18 13:48:55

这更多的是运算符优先问题,而不是级联问题。在没有括号的情况下,编译器使用算子优先表来判断计算顺序。+具有比比较更高的优先级,因此语句被计算为

代码语言:javascript
复制
return a == null 
       ? "" 
       : (a + a != null && b != null) 
            ? "\n" 
            : ("" + b == null) 
                ? "" 
                : b;

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

步骤1:

==空返回"“

步骤2:

A !=空

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

(a+a != null)总是为真,所以我们实际上是在测试b!= null

b!=空,

返回"\n“

步骤3:

如果b ==为空

检查("“+b == null)

"“+b(空)永远不等于空;始终为false

所以,返回b,它是null。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24830513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档