Conditional operator - Wikiwand
In most programming languages, ?: is called the conditional operator. It is a type of ternary operator. However, ternary operator in most situations refers specifically to ?: because it is the only operator that takes three operands.[2]
Regular usage of "?:"
?:
is used in conditional expressions. Programmers can rewrite an if-then-else expression in a more concise way by using the conditional operator.[3]
Syntax
condition ? expression 1 : expression 2
condition: An expression which is evaluated as a boolean value.
expression 1, expression 2: Expressions with values of any type.
If the condition is evaluated to true, the expression 1 will be evaluated. If the condition is evaluated to false, the expression 2 will be evaluated.
It should be read as: "If condition is true, assign the value of expression 1 to result. Otherwise, assign the value of expression 2 to result."
Association property
The conditional operator is right-associative, meaning that operations are grouped from right to left. For example, an expression of the form a ? b : c ? d : e is evaluated as a ? b : (c ? d : e).[2]
Examples by languages
Java
class ConditionalDemo2 { public static void main(String[] args) { int value1 = 1; int value2 = 2; int result; boolean someCondition = true; result = someCondition ? value1 : value2; System.out.println(result); } }
In this example, because someCondition is true, this program prints "1" to the screen. Use the ?: operator instead of an if-then-else statement if it makes your code more readable; for example, when the expressions are compact and without side-effects (such as assignments).
C++
#include <iostream> int main() { int x = 1; int y = 2; std::cout << ( x > y ? x : y ) << " is the greater of the two." << std::endl; }
There are several rules that apply to the second and third operands in C++:
- If both operands are of the same type, the result is of that type
- If both operands are of arithmetic or enumeration types, the usual arithmetic conversions (covered in Standard Conversions) are performed to convert them to a common type
- If both operands are of pointer types or if one is a pointer type and the other is a constant expression that evaluates to 0, pointer conversions are performed to convert them to a common type
- If both operands are of reference types, reference conversions are performed to convert them to a common type
- If both operands are of type void, the common type is type void
- If both operands are of the same user-defined type, the common type is that type.[4]
C#
// condition ? first_expression : second_expression; static double sinc(double x) { return x != 0.0 ? Math.Sin(x)/x : 1.0; }
There are several rules that apply to the second and third operands x and y in C#:
- If x has type X and y has type Y:
- If an implicit conversion exists from X to Y but not from Y to X, Y is the type of the conditional expression.
- If an implicit conversion exists from Y to X but not from X to Y, X is the type of the conditional expression.
- Otherwise, no expression type can be determined, and a compile-time error occurs.
- If only one of x and y has a type, and both x and y are implicitly convertible to that type, that type is the type of the conditional expression.
- Otherwise, no expression type can be determined, and a compile-time error occurs.[2]
JavaScript
var age = 26; var beverage = (age >= 21) ? "Beer" : "Juice"; console.log(beverage); // "Beer"
The conditional operator of JavaScript is compatible with the following browsers:
Chrome, Edge, Firefox (1), Internet Explorer, Opera, Safari, Android webview, Chrome for Android, Edge Mobile, Firefox for Android (4), Opera for Android, Safari on IOS, Samsung Internet, Node.js.[5]
Special usage in conditional chain
The ternary operator is right-associative, which means it can be "chained" in the following way, similar to an if ... else if ... else if ... else chain.[4]
Examples by languages
JavaScript
function example(…) { return condition1 ? value1 : condition2 ? value2 : condition3 ? value3 : value4; } // Equivalent to: function example(…) { if (condition1) { return value1; } else if (condition2) { return value2; } else if (condition3) { return value3; } else { return value4; } }
C/C++
const double a = expression1 ? a1 : expression2 ? a2 : expression3 ? a3 : /*otherwise*/ a4; // Equivalent to: double a; if (expression1) a = a1; else if (expression2) a = a2; else if (expression3) a = a3; else /*otherwise*/ a = a4;
Special usage in assignment expression
the conditional operator can yield a L-value in C/C++ which can be assigned another value, but the vast majority of programmers consider this extremely poor style, if only because of the technique's obscurity.[6]
C/C++
((foo) ? bar : baz) = frink; //equivalent to: if (foo) bar = frink; else baz = frink;