三元从句中连续两个问号是啥意思?

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 == null3 否则返回,但似乎并不重要,2 永远不会返回。

这个语句是什么意思(即我应该如何将它理解为true/false 条件的单词语句)以及2 的输入需要是什么退了吗?

【问题讨论】:

【参考方案1】:

它只是一个嵌套的三元语句。加括号更清楚:

number == null ? (required ? 1 : 2) : 3;

要返回 2,输入需要什么?

number = nullrequired = 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 = nullrequired = false

【讨论】:

以上是关于三元从句中连续两个问号是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中,两个问号一起意味着啥?

c语言中" : "(冒号)和问号是啥意思

“类型”是啥意思,ECMA 6 中的问号有啥特殊用途吗?

JAVA中,如下面的代码,?"":这问号双引号冒号是啥表达式呀?表示啥意思?怎么用?

我的文字显示为问号是啥意思?

这些代码中的问号是啥意思? [复制]