mai*_*rgs 148 java syntax ternary-operator conditional-operator
我已经使用Java几年了,但直到最近我还没有碰到这个结构:
int count = isHere ? getHereCount(index) : getAwayCount(index);
Run Code Online (Sandbox Code Playgroud)
这可能是一个非常简单的问题,但有人可以解释一下吗?我该怎么看?我很确定我知道它是如何工作的.
isHere是真的,getHereCount()被称为,isHere是假getAwayCount()则调用.正确?这个结构叫做什么?
Mic*_*ers 182
是的,它是一种速记形式
int count;
if (isHere)
count = getHereCount(index);
else
count = getAwayCount(index);
Run Code Online (Sandbox Code Playgroud)
它被称为条件运算符.许多人(错误地)将其称为三元运算符,因为它是Java,C,C++和许多其他语言中唯一的三元(三参数)运算符.但理论上可能有另一个三元运算符,而只能有一个条件运算符.
Java语言规范中给出了正式名称:
§15.25条件运算符?:
条件运算符
? :使用一个表达式的布尔值来决定应该评估两个其他表达式中的哪一个.
请注意,两个分支必须指向具有返回值的方法:
第二个或第三个操作数表达式是void方法的调用是编译时错误.
事实上,通过表达式语句(第14.8节)的语法,条件表达式不允许出现在可能出现void方法调用的任何上下文中.
所以,如果是doSomething()和doSomethingElse()void方法,你不能压缩这个:
if (someBool)
doSomething();
else
doSomethingElse();
Run Code Online (Sandbox Code Playgroud)
进入这个:
someBool ? doSomething() : doSomethingElse();
Run Code Online (Sandbox Code Playgroud)
简单的话:
booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 31
其他人已经在合理的范围内回答了这个问题,但通常使用"三元运算符"这个名称.
作为我的迂腐,我想清楚地表明运算符的名称是条件运算符或"条件运算符?:".它是一个三元运算符(因为它有三个操作数),它恰好是目前Java中唯一的三元运算符.
但是,规范很明显,它的名称是条件运算符或"条件运算符?:"是绝对明确的.我认为这是更清晰的通过名字来称呼它,因为它表明在一定程度上(评估条件)操作的行为,而不是它究竟有多少操作数了.
JRL*_*JRL 17
根据Sun Java规范,它被称为条件运算符.见15.25节.你对它的作用是正确的.
条件运算符?:使用一个表达式的布尔值来决定应该评估两个其他表达式中的哪一个.
条件运算符在语法上是右关联的(它从右到左分组),因此a?b:c?d:e?f:g表示与?b相同:(c?d:(e?f) :G)).
ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ? Expression : ConditionalExpression
Run Code Online (Sandbox Code Playgroud)
条件运算符有三个操作数表达式; ?出现在第一个和第二个表达式之间,并且:出现在第二个和第三个表达式之间.
第一个表达式必须是boolean或Boolean类型,否则会发生编译时错误.
condition ? truth : false;
Run Code Online (Sandbox Code Playgroud)
如果条件是,true则计算第一个表达式。如果条件为false,则计算第二个表达式。
int count = isHere ? getHereCount(index) : getAwayCount(index);
Run Code Online (Sandbox Code Playgroud)
方法 :
if (isHere) {
count = getHereCount(index);
} else {
count = getAwayCount(index);
}
Run Code Online (Sandbox Code Playgroud)
确切地说,不完全正确:
"返回"非常重要.这意味着方法必须返回一个值,并且该值必须在某处分配.
此外,它不完全是语法上等同于的if-else版本.例如:
String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;
Run Code Online (Sandbox Code Playgroud)
如果使用if-else编码将始终导致更多的字节码.
| 归档时间: |
|
| 查看次数: |
178113 次 |
| 最近记录: |