三元从句中连续出现两个问号是什么意思?
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 = null
和 required = 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 = null
和 required = false
最近在一段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 = null
和 required = 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 = null
和 required = false