java—三元子句中一行中的两个问号是什么意思?

soat7uwm  于 2021-07-03  发布在  Java
关注(0)|答案(5)|浏览(381)

我最近在一段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 要退货吗?

mfpqipee

mfpqipee1#

感谢@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,因为他们是这个添加的灵感来源)

hgc7kmma

hgc7kmma2#

这就是为什么显式地添加括号总是一个好主意,这样一眼就可以清楚地看到意图:

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

crcmnpdw3#

应该加上括号,这样理解起来就更清楚了 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

b09cbbtk

b09cbbtk4#

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

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

返回2需要什么输入? number = null 以及 required = false

aemubtdh

aemubtdh5#

形式的表达 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语言规范写道:
条件运算符在语法上是右联想的(它从右向左分组)

相关问题