三元从句中连续出现两个问号是什么意思?

What Do Two Question Marks in a Row in a Ternary Clause Mean?

最近在一段Java代码中看到了这个三元运算语句:

int getVal(Integer number, boolean required) {
    Integer val = number == null ? required ? 1 : 2 : 3;
    return val;
}

我从来没有见过像这样连续有两个问号(没有任何括号)的三元语句。如果我使用输入值,如果 number == null 我可以得到 1 到 return,否则我可以得到 3 到 return,但这似乎并不重要需要的是,2 永远不会 returned.

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

这就是为什么显式添加括号总是一个好主意,这样意图一目了然:

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

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

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

what would the inputs need to be for 2 to be returned?

number = nullrequired = false

感谢@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

我希望这对阅读此声明可能有困难的其他人有所帮助。

(注意:我不确定将 post 这作为对问题的更新是否更好,但由于它在技术上是“解释”,所以答案似乎是最好的地方它。如果你喜欢我的回答,请点赞@luk2302 和@racraman,因为他们是启发了这个添加的人)

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:

The conditional operator is syntactically right-associative (it groups right-to-left)

应该加上括号,这样理解起来会更清楚

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

这相当于

if (number == null)
{
    if (required == true)
    {
        return 1;
    }
    else 
    {
        return 2;
    }
}
else
{
    return 3;
}

输入需要 2 到 return number = nullrequired = false