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

前端 未结 16 1755
轮回少年
轮回少年 2020-11-21 05:27

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) : getAw         


        
相关标签:
16条回答
  • 2020-11-21 06:20

    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.

    0 讨论(0)
  • 2020-11-21 06:21

    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 
    
    0 讨论(0)
  • 2020-11-21 06:22

    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.

    0 讨论(0)
  • 2020-11-21 06:22

    Conditional expressions are in a completely different style, with no explicit if in the statement.

    The syntax is: boolean-expression ? expression1 : expression2;

    The result of this conditional expression is

    expression1 if boolean-expression is true;

    otherwise the result is expression2.

    Suppose you want to assign the larger number of variable num1 and num2 to max. You can simply write a statement using the conditional expression: max = (num1 > num2) ? num1 : num2;

    Note: The symbols ? and : appear together in a conditional expression. They form a conditional operator and also called a ternary operator because it uses three operands. It is the only ternary operator in Java.

    cited from: Intro to Java Programming 10th edition by Y. Daniel Liang page 126 - 127

    0 讨论(0)
  • 2020-11-21 06:23

    This construct is called Ternary Operator in Computer Science and Programing techniques.
    And Wikipedia suggest the following explanation:

    In computer science, a ternary operator (sometimes incorrectly called a tertiary operator) is an operator that takes three arguments. The arguments and result can be of different types. Many programming languages that use C-like syntax feature a ternary operator, ?: , which defines a conditional expression.

    Not only in Java, this syntax is available within PHP, Objective-C too.

    In the following link it gives the following explanation, which is quiet good to understand it:

    A ternary operator is some operation operating on 3 inputs. It's a shortcut for an if-else statement, and is also known as a conditional operator.

    In Perl/PHP it works as:
    boolean_condition ? true_value : false_value

    In C/C++ it works as:
    logical expression ? action for true : action for false

    This might be readable for some logical conditions which are not too complex otherwise it is better to use If-Else block with intended combination of conditional logic.

    We can simplify the If-Else blocks with this Ternary operator for one code statement line.
    For Example:

    if ( car.isStarted() ) {
         car.goForward();
    } else {
         car.startTheEngine();
    }
    

    Might be equal to the following:

    ( car.isStarted() ) ? car.goForward() : car.startTheEngine();
    

    So if we refer to your statement:

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

    It is actually the 100% equivalent of the following If-Else block:

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

    That's it!
    Hope this was helpful to somebody!
    Cheers!

    0 讨论(0)
  • 2020-11-21 06:23

    Actually it can take more than 3 arguments. For instance if we want to check wether a number is positive, negative or zero we can do this:

    String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";
    

    which is better than using if, else if, else.

    0 讨论(0)
提交回复
热议问题