是否应该在三元运算符周围放置括号?

时间:2010-09-01 17:48:49

标签: java ternary-operator

Checkstyle抱怨以下内容:

return (null == a ? a : new A());

并说这些不必要。

虽然声明在没有它们的情况下确实可以正常工作,但它们的存在似乎更具可读性 - 否则当我读它时我倾向于看到:

return null

首先,然后必须暂停考虑剩余的

== a ? a : new A(); 
部分原因,因为我的大脑已经走了一条路。

此外,每当我看到一个三元运算符时,我倾向于做同样的事情,除非它被分组为parens。

所以:围绕三元的parens应该是事实上的标准吗?有没有理由不把它们放在那里?

6 个答案:

答案 0 :(得分:7)

嗯,checkstyle是对的,括号对于执行是没用的。但是执行无用对于良好的代码读取并不意味着无用。如果阅读更有意义,你应该留下它们。

我认为此代码不需要更多括号:

int number = (myBoolean)? 1 : 2;

但在你的情况下,return关键字和你的布尔值是表达式的事实可以改变你阅读语句的方式。

答案 1 :(得分:5)

在阅读return语句时,我知道'return'和';'之间的所有内容是什么将被返回,所以我无法读取你的代码示例作为返回null后跟一些符号,因为你声称你读它。

也许阅读解析技术可能会帮助你像我一样看待它。也就是说,我还没有真正阅读过解析技术,虽然多年来我一起拼凑了几个解析器。

我总是删除不必要的括号。它们无助于代码理解,因为我非常了解Java的运算符优先级。奇怪的是,我不确定,我加上括号,等待IDEA告诉我他们是多余的。然后我删除它们,并尝试承诺记住我刚发现的优先规则。

在我继承的代码库中,我倾向于在代码区域中找到最多数量的冗余括号,因为其他原因这些代码很差,所以我将两者联系起来。

答案 2 :(得分:2)

不,它不应该是事实上的标准。我更喜欢没有parens。

我认为将它们放在那里的唯一理由是强制执行评估令或澄清令人困惑的界限。

答案 3 :(得分:1)

这两个选项都是正确的,如果您单独工作,请使用您的团队使用的内容或您喜欢的内容
IIRC默认情况下,checkstyle使用Sun的(r.i.p)风格指南,因此如果你想要符合标准风格,请听它并删除它们。

答案 4 :(得分:1)

一般情况下,

围绕三元(也称为条件)运算符或其部分的括号不需要,因为它们的优先级在操作顺序上非常低(仅在逻辑运算符和上面的赋值之下)。请参阅下面的链接以获取完整的表格。

因此,可以说,这些不必要的问题会使代码视觉上混乱
代码,并且它们会在程序员身上显示缺乏理解

可能需要在三元组中或周围使用parens的例外情况是:

  • 如果你的三元素足够复杂,值得多行;然后你可以用parens包围你的陈述,以防止自动分号插入。

  • 如果你的三元嵌套在另一个三元组中。

另见MDN:

答案 5 :(得分:0)

由于您的问题的基础与阅读代码的行为有关,我将从这个角度处理问题。

所谓的“速读”培训计划的基本原则之一是,他们试图让读者开发文本行的格式塔而不是按顺序读取它 - 逐字逐句。您可能会尝试从他们的书中取出一个页面并从代码中退一步 - 从字面上看,如果必要的话 - 了解整行,而不是将阅读行为视为通过令牌解析令牌的行为。

或者,您可以使用一个允许您配置样式的编辑器:您可以使三元运算符具有不同的颜色,以便它跳出来。例如,Notepad ++有许多内置主题,与许多其他编辑器一样。