什么是Java?:操作符调用,它做了什么?

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)

  • 我假设doSomething()和doSomethingElse()是void方法.该规范的最后一点说的是三元运算符*必须*返回一个值,因此没有一个操作数可以是void方法. (7认同)
  • 把它称为"三元运营商"并不是错误的,就像将奥巴马称为"总统"一样并不是错误的(2016年),尽管将来可能会有其他总统. (4认同)
  • @DawoodibnKareem我认为Michael故意将“ the”包含在“三元运算符”的斜体中,*这*是*他的意思是错误的,而不是说“三元运算符”是错误的。*三元运算符表示,正如迈克尔所说,这是唯一的,这反过来可能导致一个人假设没有其他三元运算符,这就是迈克尔所说的错误,我同意,它*将*是一个错误的假设。 (2认同)

Jon*_*eet 31

其他人已经在合理的范围内回答了这个问题,但通常使用"三元运算符"这个名称.

作为我的迂腐,我想清楚地表明运算符的名称是条件运算符或"条件运算符?:".它是一个三元运算符(因为它有三个操作数),它恰好是目前Java中唯一的三元运算符.

但是,规范很明显,它的名称是条件运算符或"条件运算符?:"是绝对明确的.我认为这是更清晰的通过名字来称呼它,因为它表明在一定程度上(评估条件)操作的行为,而不是它究竟有多少操作数了.

  • 我只是认为值得通过其定义的名称调用一些东西.特别是,如果Java有另一个三元运算符,使用术语"条件运算符"的人仍然是正确和明确的 - 不像那些只说"三元运算符"的人.是的,短语"三元运算符"已经卡住了 - 我的答案是"解开"它的努力的一部分,正如我试图纠正"通过引用传递对象"的说法. (16认同)
  • 这个答案在技术上是正确的.但是,由于只有一个三元运算符,您经常会将其称为三元运算符.即使这个名称没有表达运算符的完整含义,但它仍然是一个卡住的名称.如果你提到名称"三元运算符",程序员就会知道你在说什么.您提到的规范也将此运算符称为"三元条件",它似乎更具信息性.http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.28 (3认同)

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类型,否则会发生编译时错误.


Joe*_*ips 8

condition ? truth : false;
Run Code Online (Sandbox Code Playgroud)

如果条件是,true则计算第一个表达式。如果条件为false,则计算第二个表达式。

它称为条件运算符,是三元运算的一种。


Rom*_*las 5

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)


Ric*_*chN 5

确切地说,不完全正确:

  1. 如果isHere为true,则返回 getHereCount()的结果
  2. 另外,返回 getAwayCount()的结果

"返回"非常重要.这意味着方法必须返回一个值,并且该值必须在某处分配.

此外,它不完全是语法上等同于的if-else版本.例如:

String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;
Run Code Online (Sandbox Code Playgroud)

如果使用if-else编码将始终导致更多的字节码.