What is the Java ?: operator called and what does

2018-12-31 00:39发布

I have been working with Java a couple of years, but up until recently I haven't run across this construct:

int count = isHere ? getHereCount(index) : getAwayCount(index);

This is probably a very simple question, but can someone explain it? How do I read it? I am pretty sure I know how it works.

  • if isHere is true, getHereCount() is called,
  • if isHere is false getAwayCount() is called.

Correct? What is this construct called?

15条回答
人气声优
2楼-- · 2018-12-31 01:19

Yes, it is a shorthand form of

int count;
if (isHere)
    count = getHereCount(index);
else
    count = getAwayCount(index);

It's called the conditional operator. Many people (erroneously) call it the ternary operator, because it's the only ternary (three-argument) operator in Java, C, C++, and probably many other languages. But theoretically there could be another ternary operator, whereas there can only be one conditional operator.

The official name is given in the Java Language Specification:

§15.25 Conditional Operator ? :

The conditional operator ? : uses the boolean value of one expression to decide which of two other expressions should be evaluated.

Note that both branches must lead to methods with return values:

It is a compile-time error for either the second or the third operand expression to be an invocation of a void method.

In fact, by the grammar of expression statements (§14.8), it is not permitted for a conditional expression to appear in any context where an invocation of a void method could appear.

So, if doSomething() and doSomethingElse() are void methods, you cannot compress this:

if (someBool)
    doSomething();
else
    doSomethingElse();

into this:

someBool ? doSomething() : doSomethingElse();

Simple words:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 
查看更多
梦寄多情
3楼-- · 2018-12-31 01:22

According to the Sun Java Specification, it's called the Conditional Operator. See section 15.25. You're right as to what it does.

The conditional operator ? : uses the boolean value of one expression to decide which of two other expressions should be evaluated.

The conditional operator is syntactically right-associative (it groups right-to-left), so that a?b:c?d:e?f:g means the same as a?b:(c?d:(e?f:g)).

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

The conditional operator has three operand expressions; ? appears between the first and second expressions, and : appears between the second and third expressions.

The first expression must be of type boolean or Boolean, or a compile-time error occurs.

查看更多
初与友歌
4楼-- · 2018-12-31 01:23

Yes, you are correct. ?: is typically called the "ternary conditional operator", often referred to as simply "ternary operator". It is a shorthand version of the standard if/else conditional.

Ternary Conditional Operator

查看更多
其实,你不懂
5楼-- · 2018-12-31 01:27

Correct. It's called the ternary operator. Some also call it the conditional operator.

查看更多
萌妹纸的霸气范
6楼-- · 2018-12-31 01:31
int count = isHere ? getHereCount(index) : getAwayCount(index);

means :

if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}
查看更多
临风纵饮
7楼-- · 2018-12-31 01:39

Not exactly correct, to be precise:

  1. if isHere is true, the result of getHereCount() is returned
  2. otheriwse the result of getAwayCount() is returned

That "returned" is very important. It means the methods must return a value and that value must be assigned somewhere.

Also, it's not exactly syntactically equivalent to the if-else version. For example:

String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;

If coded with if-else will always result in more bytecode.

查看更多
登录 后发表回答