三元从句中连续两个问号是啥意思?
Posted
技术标签:
【中文标题】三元从句中连续两个问号是啥意思?【英文标题】:What Do Two Question Marks in a Row in a Ternary Clause Mean?三元从句中连续两个问号是什么意思? 【发布时间】:2021-03-25 21:13:57 【问题描述】:最近在一段Java代码中看到了这个三元运算语句:
int getVal(Integer number, boolean required)
Integer val = number == null ? required ? 1 : 2 : 3;
return val;
我从来没有见过像这样连续有两个问号的三元语句(没有任何括号)。如果我使用输入值,我可以让1
返回,如果number == null
和3
否则返回,但似乎并不重要,2
永远不会返回。
这个语句是什么意思(即我应该如何将它理解为true
/false
条件的单词语句)以及2
的输入需要是什么退了吗?
【问题讨论】:
【参考方案1】:它只是一个嵌套的三元语句。加括号更清楚:
number == null ? (required ? 1 : 2) : 3;
要返回 2,输入需要什么?
number = null
和 required = false
【讨论】:
我同意,括号让事情变得更好。谢谢!【参考方案2】:这就是为什么显式添加括号总是一个好主意,所以意图一目了然:
Integer val = number == null ? (required ? 1 : 2) : 3;
【讨论】:
我同意,括号使事情更容易阅读。谢谢!【参考方案3】:感谢@luk2302 和@racraman 的回答!根据您在括号中列出的理解:
Integer val = number == null ? (required ? 1 : 2) : 3;
我只想补充一点,将其“解读”为真实陈述的方式是:
If opt == null and required == true: 1
If opt == null and required == false: 2
If opt != null: 3 // value of required doesn't matter
我希望这可以帮助其他可能无法阅读此声明的人。
(注意:我不确定将其作为问题的更新发布是否更好,但由于它在技术上是“解释”,因此答案似乎是最好的地方。如果你喜欢我的回答,请为@luk2302 和@racraman 投票,因为他们是这个添加的灵感来源)
【讨论】:
您将其作为答案发布是正确的。 谢谢@Andreas,感谢您的保证/确认!【参考方案4】:a ? b ? c : d : e
形式的表达式使用条件运算符两次。唯一的含糊之处在于顺序。
它不能表示(a ? b) ? c : d : e
,因为那会是一个语法错误。
因此,它必须表示a ? (b ? c : d) : e
。
即等价于:
if (a)
if (b)
return c;
else
return d;
else
return e;
一个更有趣的案例是
a ? b : c ? d : e
可以读作
(a ? b : c) ? d : e
或
a ? b : (c ? d : e)
为了解决这种歧义,Java 语言规范writes:
条件运算符在语法上是右关联的(它从右到左分组)
【讨论】:
幸运的是,在现实世界的代码库/示例中从未见过a ? b : c ? d : e
,看起来很吓人...【参考方案5】:
应该加括号,这样理解会更清楚
Integer val = number == null ? (required ? 1 : 2) : 3;
这相当于
if (number == null)
if (required == true)
return 1;
else
return 2;
else
return 3;
输入需要 2 才能返回
number = null
和 required = false
【讨论】:
以上是关于三元从句中连续两个问号是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章