Ternary conditional operator
In computer programming, the ternary conditional operator is a ternary operator that evaluates to one of two values based on a Boolean expression. The operator is also known as conditional operator, ternary if, or inline if (iif). Although many ternary operators are theoretically possible, the conditional operator is commonly used and other ternary operators rare, so the conditional variant is commonly referred to as the ternary operator. Typical syntax for an expression using the operator is like The construct originally comes from CPL, in which equivalent syntax for PatternsAssignmentThe value of the operator can be assigned to a variable. For a weakly typed language, the data type of the selected value may determine the type of the assigned value. For a strongly typed language, both value expressions must evaluate to a type that is compatible with the target variable. The operator is similar to the way conditional expressions (if-then-else) work in functional programming languages, like Scheme, ML, Haskell, and XQuery, since if-then-else forms an expression instead of a statement in those languages. The operator allows for initializing a variable via a single statement which otherwise might require multiple statements. Use in variable assignment reduces the probability of a bug from a faulty assignment as the assigned variable is stated only once. For example, in Python: x: str = 'foo' if b else 'bar'
instead of: x: str
if b:
x = 'foo'
else:
x = 'bar'
In a language with block scope, a variable must be declared before the if-else statement. For example: std::string s;
if (b) {
s = "foo";
} else {
s = "bar";
}
Use of the conditional operator simplifies this: std::string s = b ? "foo" : "bar";
Furthermore, since initialization is now part of the declaration, rather than a separate statement, the identifier can be a constant. For example: const std::string s = b ? "foo" : "bar";
Case selectorThe conditional operator can be used for case selectors. For example: vehicle = arg == 'B' ? bus :
arg == 'A' ? airplane :
arg == 'T' ? train :
arg == 'C' ? car :
arg == 'H' ? horse :
feet;
VariationsThe syntax and semantics of the operator varies by language. Major differences include whether the expressions can have side effects and whether the language provides short-circuit evaluation semantics, whereby only the selected expression is evaluated. If a language supports expressions with side effects but does not specify short-circuit evaluation, then a further distinction exists about which expression evaluates first. If no order is guaranteed, a distinction exists about whether the result is then classified as indeterminate (the value obtained from some order) or undefined (any value at all at the whim of the compiler in the face of side effects, or even a crash). If a language does not permit side-effects in expressions (common in functional languages), then the order of evaluation has no value semantics – though it may yet bear on whether an infinite recursion terminates, or have other performance implications (in a functional language with match expressions, short-circuit evaluation is inherent, and natural uses for the ternary operator arise less often, so this point is of limited concern). For these reasons, in some languages the statement form The associativity of nested ternary operators can also differ from language to language. In almost all languages, the ternary operator is right associative so that Equivalence to mapThe ternary operator can also be viewed as a binary map operation. In R—and other languages with literal expression tuples—one can simulate the ternary operator with something like the R expression If the language provides a mechanism of futures or promises, then short-circuit evaluation can sometimes also be simulated in the context of a binary map operation. ExamplesAdaThe 2012 edition of Ada has introduced conditional expressions (using Pay_per_Hour := (if Day = Sunday then 12.50 else 10.00);
When the value of an if_expression is itself of Boolean type, then the ALGOL 60ALGOL 60 introduced conditional expressions (ternary conditionals) to imperative programming languages. This conditional statement: integer opening_time;
if day = Sunday then
opening_time := 12;
else
opening_time := 9;
Can be rewritten with the conditional operator:: integer opening_time;
opening_time := if day = Sunday then 12 else 9;
ALGOL 68Both ALGOL 68's choice clauses (if and case clauses) support the following:
BashA true ternary operator only exists for arithmetic expressions: ((result = condition ? value_if_true : value_if_false))
For strings there only exist workarounds, like e.g.: result=$([[ "$a" = "$b" ]] && echo "value_if_true" || echo "value_if_false")
Where C familyThe following code in C assigns result = a > b ? x : y;
Only the selected expression is evaluated. In this example, x and y require no evaluation, but they can be expressions with side effects. Only the side-effect for the selected expression value will occur.[5][6] Common LispAssignment using a conditional expression in Common Lisp: (setq result (if (> a b) x y))
Alternative form: (if (> a b)
(setq result x)
(setq result y))
FortranAs part of the Fortran-90 Standard, the ternary operator was added to Fortran as the intrinsic function variable = merge(x,y,a>b)
Note that both x and y are evaluated before the results of one or the other are returned from the function. Here, x is returned if the condition holds true and y otherwise. Fortran-2023 added conditional expressions which evaluate one or the other of the expressions based on the conditional expression: variable = ( a > b ? x : y )
KotlinKotlin does not include the traditional val max = if (a > b) a else b
LuaLua does not have a traditional conditional operator. However, the short-circuiting behavior of its var = cond and a or b
This will succeed unless There are also other variants that can be used, but they're generally more verbose: var = (
{
[true] = a,
[false] = b
}
)[not not cond]
Luau, a dialect of Lua, has ternary expressions that look like if statements, but unlike them, they have no -- in Luau
var = if cond then a else b
-- with elseif clause
sign = if var < 0 then -1 elseif var == 0 then 0 else 1
PascalPascal was both a simplification and extension of ALGOL 60 (mainly for handling user-defined types). One simplification was to remove the conditional expression since the same could be achieved with the less succinct conditional statement form. RemObjects Oxygene added a ternary operator to Object Pascal in approximately 2011,[9] and in 2025 Delphi followed suit.[10] Oxygene supports case/switch statements, essentially a repeated if, as expressions evaluating to a value as well.[11] PythonAn operator for a conditional expression in Python was approved as Python Enhancement Proposal 308 and was added to the 2.5 release in September 2006. Python's conditional operator differs from the common result = x if a > b else y
This form invites considering RustBeing an expression-oriented programming language, Rust's existing Note the lack of semi-colons in the code below compared to a more declarative let x = 5;
let y = if x == 5 {
10
} else {
15
};
This could also be written as: let y = if x == 5 { 10 } else { 15 };
Note that curly braces are mandatory in Rust conditional expressions. You could also use a let y = match x {
5 => 10,
_ => 15,
};
SmalltalkEvery expression (message send) has a value. Thus |x y|
x := 5.
y := (x == 5) ifTrue:[10] ifFalse:[15].
SQLThe SQL With one conditional it is equivalent (although more verbose) to the ternary operator: SELECT (CASE WHEN a > b THEN x ELSE y END) AS CONDITIONAL_EXAMPLE
FROM tab;
This can be expanded to several conditionals: SELECT (CASE WHEN a > b THEN x WHEN a < b THEN y ELSE z END) AS CONDITIONAL_EXAMPLE
FROM tab;
Visual BasicVisual Basic provides a ternary conditional function, Dim opening_time As Integer = IIf((day = SUNDAY), 12, 9)
As a function, the values of the three arguments are evaluated before the function is called. To avoid evaluating the expression that is not selected, the Dim name As String = If(person Is Nothing, "", person.Name)
See also
References
External links |