带和不带 () 的条件运算符

Posted

技术标签:

【中文标题】带和不带 () 的条件运算符【英文标题】:Conditional Operator with and without () 【发布时间】:2012-03-09 00:45:51 【问题描述】:

当我想打印我的一个对象(这显然不是空的)时,我遇到了一些奇怪的事情。

如果我使用这条线:

text.append("\n [ITEM ID]: " + (item == null ? (otherItem == null ? 0 : otherItem .getItems().get(i).getId()) : item .getItems().get(i).getId()));

如果我的item 对象是null,则没有空指针异常。当然这应该是例外的结果。但是如果我在没有() 标记的情况下使用它:

text.append("\n [ITEM ID]: " + item == null ? (otherItem == null ? 0 : otherItem .getItems().get(i).getId()) : item .getItems().get(i).getId())

我以为条件运算符不执行运算符的其他部分,但我得到了 NullPointerException。

如果有人向我解释一下,为什么在这种情况下必须使用 () 标记,我将不胜感激。

【问题讨论】:

运算符优先级的情况? 提示:"\n [ITEM ID]: " + item 变成...? 【参考方案1】:

"\n [ITEM ID]: "item 之间的连接将优先于相等测试和条件运算符,如果你不放括号(参见 Java 运算符中的 precedences),所以如果你必须把它们放在你希望它工作(因为("\n [ITEM ID]: " + item) == null 可能不是你想要评估的)。

【讨论】:

谢谢。两个完美的答案,我不知道哪个接受。但我认为我应该接受第一个,但非常感谢 talnicolas!这就是我需要的括号... @czupe 好吧,我实际上是第一个回答的,但无论如何都欢迎你 ;) 好的。如果您是第一个,并评估您编写了 == vs + 运算符,我认为您赢得了我的接受。再次感谢。祝你有美好的一天......【参考方案2】:

+ 运算符的优先级高于? :,因此您确实需要使用括号。见http://bmanolov.free.fr/javaoperators.php

【讨论】:

在这种情况下,优先级高于== 是的,更珍贵的是连接运算符的优先级高于 == (并且条件运算符无关紧要),我明白......

以上是关于带和不带 () 的条件运算符的主要内容,如果未能解决你的问题,请参考以下文章

带和不带 lambda 的 pandas apply()

Kotlin 只读属性,带和不带 getter

带和不带 FILTER 的 DAX 计算函数

带和不带的 SQL 查询

在mysql中执行带和不带索引的查询

带和不带引号和括号的 setTimeout 之间的区别