What is the Java ?: operator called and what does it do?

249,828

Solution 1

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 

Solution 2

Others have answered this to reasonable extent, but often with the name "ternary operator".

Being the pedant that I am, I'd like to make it clear that the name of the operator is the conditional operator or "conditional operator ?:". It's a ternary operator (in that it has three operands) and it happens to be the only ternary operator in Java at the moment.

However, the spec is pretty clear that its name is the conditional operator or "conditional operator ?:" to be absolutely unambiguous. I think it's clearer to call it by that name, as it indicates the behaviour of the operator to some extent (evaluating a condition) rather than just how many operands it has.

Solution 3

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.

Solution 4

condition ? truth : false;

If the condition is true then evaluate the first expression. If the condition is false, evaluate the second expression.

It is called the Conditional Operator and it is a type of Ternary Operation.

Solution 5

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.

Share:
249,828

Related videos on Youtube

mainstringargs
Author by

mainstringargs

Updated on March 22, 2022

Comments

  • mainstringargs
    mainstringargs about 2 years

    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?

    • palantus
      palantus about 15 years
      See also stackoverflow.com/questions/795286/what-does-do-in-c for the C++ version of this question (asked just yesterday, in fact).
    • Paul Tomblin
      Paul Tomblin about 15 years
      Keep in mind that the C/C++/Java world is pretty evenly divided between people who think it's ugly and confusing and will avoid it like the plague, and people who think you can't really claim to know C, C++ or Java if you can't recognize it and use it without pausing to think.
    • Yishai
      Yishai about 15 years
      It is generally considered bad form in Java to use it beyond the clearest and simplest of cases. If you find yourself nesting them, you are way out. On the other hand, in the C culture where fast and clever code is valued above clarity, it is considered acceptable.
    • Dan
      Dan about 15 years
      answer_to_question = (recognize_operator) ? (social_acceptance) : (condescending_finger_wag)
  • Paul Tomblin
    Paul Tomblin about 15 years
    To quote Alice In Wonderland, it's called the ternary operator, but its name is the Conditional Operator.
  • palantus
    palantus about 15 years
    But the name of it is called the question-mark colon operator.
  • Gary
    Gary about 15 years
    This answer is technically correct. However, since there is only one ternary operator you often see it referred to as the ternary operator. Even though this name does not convey the complete meaning of the operator, it is a name that has stuck. If you mention the name "ternary operator", programmers know what you are talking about. The spec you mention also refers to this operator as the "Ternary Conditional" which seems more informative. java.sun.com/docs/books/jls/third_edition/html/…
  • Jon Skeet
    Jon Skeet about 15 years
    I just think it's worth calling something by its defined name. In particular, if Java ever gets another ternary operator, people who use the term "conditional operator" will still be correct and unambiguous - unlike those who just say "ternary operator". Yes, the phrase "ternary operator" has stuck - my answer is part of an effort to "unstick" it, just as I try to correct the claim that "objects are passed by reference".
  • palantus
    palantus about 15 years
    That operator is not one of my favorites from Project Coin. Limited usefulness, not intuitive to read, and just plain ugly as all get-out. Maybe it would grow on me, though.
  • Brett
    Brett about 15 years
    Naming naming sound a bit C++ish. The question mark colon operator ?: (one token) is known as the Elvis operator.
  • Brett
    Brett about 15 years
    I believe javac is at liberty to generate the same bytecode. Although you are correct that there are obscure corner cases where they are not equivalent.
  • Brett
    Brett about 15 years
    IIRC< Neal didn't propose it. He just used it as a simple example of how to write a proposal. More details on the project coin mailing list archive.
  • RichN
    RichN about 15 years
    Yes, of course. For me, the true merit of the conditional operator is the example I've given. The alternative are either: // gasp!! String temp = str1; if (check) temp += str2; else temp += str3; temp += str4; return temp; or handcoding the StringBuilder append operation. The 1st one suffer from serious efficiency issue while the 2nd one is too verbose and is a painstaking effort without much gain.
  • johnny
    johnny about 15 years
    I don't understand what the bottom one does that is wrong. I believe you and all. It just looks the same to me as the original. Is it because they just call another function that may or may not return a value and allow the next code set to run?
  • MaxG
    MaxG over 10 years
    It says a bit more than that. It says the conditional operator isn't allowed where a void method COULD appear. So, for example, the following statements: VALID: String x = (false) ? "X" : "Y"; NOT VALID: (false) ? "X" : "Y";
  • Dawood ibn Kareem
    Dawood ibn Kareem over 7 years
    It is not erroneous to call it the "ternary operator", just as it is not erroneous (in 2016) to refer to Obama as "the President", even though it is possible that there will be other presidents in the future.
  • Dawood ibn Kareem
    Dawood ibn Kareem over 7 years
    May I direct you to this page from Oracle which speaks of three "conditional operators" but only one "ternary operator"? If you want to make it clear which operator you mean, it's probably better to use the name that most people use. (Yes, I know I'm showing up at the party just as the host is washing the last of the dishes).
  • Jon Skeet
    Jon Skeet over 7 years
    @DavidWallace: Using "conditional operator ?:" is better, IMO - will edit to clarify that. But I do think it's worth persuading people to use the actual name of the operator rather than focusing on one aspect of it (how many operands it has) that has nothing to do with its behaviour. (It's also not uncommon for tutorials to be less precise than the specification, which calls && the conditional-and operator, and || the conditional-or operator, but uses just "the conditional operator" for ?:.
  • Dawood ibn Kareem
    Dawood ibn Kareem over 7 years
    I don't know. If someone says "conditional operator" to me, I won't be sure what they mean. Where I come from (the opposite end of the world from you) people just don't call it this. If they say "ternary operator" or "hook operator", then I understand. I admire your ambition, wanting to change the way people talk. If anyone can do it, it's you. But I neither hold out much hope nor see much point.
  • Jon Skeet
    Jon Skeet over 7 years
    @DavidWallace: I would say if someone says to you "the conditional operator" you should be clear what they mean - and if they actually mean && or || they should have said conditional-and or conditional-or, unless it's absolutely clear from context. If someone said "hook operator" to me I'd have no idea what they meant. And yes, this sort of gradual community improvement is possible - 20 years ago, it was very common for people to talk about Java being pass-by-reference; these days, it still crops up but is corrected very quickly.
  • Dawood ibn Kareem
    Dawood ibn Kareem over 7 years
    Yes, I should. I probably don't. And it might get harder if Java introduces some of the new conditional operators that have been mooted for dealing with nulls.
  • Jon Skeet
    Jon Skeet over 7 years
    @DavidWallace: I'd expect those to get new names, just like in C# there's the "conditional null" operator but "the conditional operator" is still the name for ?:.
  • Dawood ibn Kareem
    Dawood ibn Kareem over 7 years
    It will be interesting to see what happens, if Java does ever get anything like C#'s ?? and ?. operators. In the mean time, I'd have to say that I use ?: so seldom that the only time I ever get to talk about it is when answering or commenting on Stack Overflow questions. I will try to remember to call it "conditional operator" in my answers from now on. Thank you for your wisdom and guidance.
  • 2280259
    2280259 over 6 years
    @DawoodibnKareem - Totally agree and the same JLS we're discussing here says this The ternary conditional operator ? : (§15.25) too.
  • Ghoti and Chips
    Ghoti and Chips over 6 years
    @DawoodibnKareem I think Michael deliberately included the in the italicisation of the ternary operator, and that's what he means is erroneous, not that ternary operator is erroneous. The ternary operator implies that, as Michael says, it is the only one, which in turn could lead one to assume there can be no other ternary operators, which is what Michael is saying is erroneous, and I'd agree, it would be an erroneous assumption.
  • Mark Schultheiss
    Mark Schultheiss about 6 years
    Note the documentation actually calls it a conditional operator; ternary docs.oracle.com/javase/tutorial/java/nutsandbolts/…
  • Gerold Broser
    Gerold Broser almost 4 years
    According to JLS, 15.25. Conditional Operator ? : it's evaluate rather than "return" and expression rather than "parameter".
  • passer-by
    passer-by over 2 years
    Contrary to the assertion that the condition operator is 'shorthand' for anything- if-else is a statement, ?: is used in expressions. If you think of the latter, you'll get confused: as evidenced by the SO questions about getting "not a statement" errors because they wrote x ? y : z as a statement. See some of the comments to this very answer.
  • passer-by
    passer-by over 2 years
    It's not "erroneous" to call the conditional operator "the operator with three operands", it's just silly - because it says nothing at all about what the operator actually is or does.
  • cryanbhu
    cryanbhu about 2 years
    so I cannot assign a variable there right, e.g. x() ? y() : z, where z is a variable?