Wiki Markup |
---|
The conditional operator {{? :}} uses the {{boolean}} value of one expression to decide which of the other two other expressions should be evaluated, see \[[JLS Section 15.25, Conditional Operator ? :|http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.2505|AA. Java References#JLS 05]\]. |
The conditional operator is syntactically right-associative. For instance a?b:c?d:e?f:g
is equivalent to a?b:(c?d:(e?f:g))
.
Format:
ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ? Expression : ConditionalExpression
- If the value of the first operand is
true
, then the second operand expression is chosen - If the value of the first operand is
false
, then the third operand expression is chosen
The rules that define the resultant type are given in the following table, where the first match, starting from the top, is used. In the table, *
refers to constant expressions of type int
(such as '0' or variables declared as final
):
Operand 2 | Operand 3 | Resultant type |
---|---|---|
type T | type T | type T |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
other numeric | other numeric | promoted type of the 2nd and 3rd operands |
T1 = boxing conversion (S1) | T2 = boxing conversion(S2) | apply capture conversion to lub(T1,T2) |
...
This compliant solution recommends the use of the same types for the second and third operands of the conditional expressions. The clearer semantics helps help avoid confusion.
Code Block | ||
---|---|---|
| ||
public class Expr { public static void main(String[] args) { char alpha = 'A'; char i = 0; //declare as char System.out.print(true ? alpha : 0); System.out.print(false ? i : alpha); } } |
Exceptions
EXP00: It is permissible to use operands of different types when Another solution is to declare the offending type as is declred final
. As a resultConsequently, it turns into a constant expression and numeric promotion does not occur.
...