Ternary conditional operator
In computer programming, the ternary conditional operator is a ternary operator that is part of the syntax for basic conditional expressions in several programming languages. It is commonly referred to as the conditional operator, conditional expression, ternary if, or inline if (abbreviated iif). An expression It originally comes from CPL, in which equivalent syntax for Although many ternary operators are possible, the conditional operator is so common, and other ternary operators so rare, that the conditional operator is commonly referred to as the ternary operator. VariationsThe detailed semantics of "the" ternary operator as well as its syntax differs significantly from language to language. A top level distinction from one language to another is whether the expressions permit side effects (as in most procedural languages) and whether the language provides short-circuit evaluation semantics, whereby only the selected expression is evaluated (most standard operators in most languages evaluate all arguments). If the language supports expressions with side effects but does not specify short-circuit evaluation, then a further distinction exists about which expression evaluates first—if the language guarantees any specific order (bear in mind that the conditional also counts as an expression). Furthermore, 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 the 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. Conditional assignmentOriginally from ALGOL 60 the conditional assignment of ALGOL is: variable := if condition then expression_1 else expression_2;
condition ? value_if_true : value_if_false The condition is evaluated true or false as a Boolean expression. On the basis of the evaluation of the Boolean condition, the entire expression returns value_if_true if condition is true, but value_if_false otherwise. Usually the two sub-expressions value_if_true and value_if_false must have the same type, which determines the type of the whole expression. The importance of this type-checking lies in the operator's most common use—in conditional assignment statements. In this usage it appears as an expression on the right side of an assignment statement, as follows: variable = condition ? value_if_true : value_if_false; The ?: operator is similar to the way conditional expressions (if-then-else constructs) 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. UsageThe conditional operator's most common usage is to create a terse, simple conditional assignment. For example, if we wish to implement some C code to change a shop's normal opening hours from 9 o'clock to 12 o'clock on Sundays, we may use int opening_time = (day == SUNDAY) ? 12 : 9;
instead of the more verbose int opening_time;
if (day == SUNDAY)
opening_time = 12;
else
opening_time = 9;
The two forms are nearly equivalent. Keep in mind that the Most of the languages emphasizing functional programming don't need such an operator as their regular conditional expression(s) is an expression in the first place e.g. the Scheme expression Note that some languages may evaluate both the true- and false-expressions, even though only one or the other will be assigned to the variable. This means that if the true- or false-expression contain a function call, that function may be called and executed (causing any related side-effects due to the function's execution), regardless of whether or not its result will be used. Programmers should consult their programming language specifications or test the ternary operator to determine whether or not the language will evaluate both expressions in this way. If it does, and this is not the desired behaviour, then an if-then-else statement should be used. ActionScript 3condition ? value_if_true : value_if_false
AdaThe 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 (thus ternary conditionals) to imperative programming languages. if <boolean expression> then <expression> else <expression> Rather than a conditional statement: integer opening_time;
if day = Sunday then
opening_time := 12;
else
opening_time := 9;
the programmer could use the conditional expression to write more succinctly: integer opening_time;
opening_time := if day = Sunday then 12 else 9;
ALGOL 68Both ALGOL 68's choice clauses (if and the case clauses) provide the coder with a choice of either the "bold" syntax or the "brief" form.
if condition then statements [ else statements ] fi
if condition1 then statements elif condition2 then statements [ else statements ] fi
APLWith the following syntax, both expressions are evaluated (with result ← value_if_true ⊣⍣ condition ⊢ value_if_false
This alternative syntax provides short-circuit evaluation: result ← { condition : expression_if_true ⋄ expression_if_false } ⍬
AWKresult = condition ? value_if_true : value_if_false
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 CA traditional if-else construct in C is written: if (a > b) {
result = x;
}
else {
result = y;
}
This can be rewritten as the following statement: result = a > b ? x : y;
As in the if-else construct only one of the expressions 'x' and 'y' is evaluated. This is significant if the evaluation of 'x' or 'y' has side effects.[5] The behaviour is undefined if an attempt is made to use the result of the conditional operator as an lvalue.[5] A GNU extension to C allows omitting the second operand, and using implicitly the first operand as the second also: a = x ? : y;
The expression is equivalent to a = x ? x : y;
except that expressions a and x are evaluated only once. The difference is significant if evaluating the expression has side effects. This shorthand form is sometimes known as the Elvis operator in other languages. C#In C#, if condition is true, first expression is evaluated and becomes the result; if false, the second expression is evaluated and becomes the result. As with Java only one of two expressions is ever evaluated. // condition ? first_expression : second_expression;
static double sinc(double x)
{
return x != 0.0 ? Math.Sin(x) / x : 1.0;
}
C++Unlike in C, the precedence of the In C++ there are conditional assignment situations where use of the if-else statement is impossible, since this language explicitly distinguishes between initialization and assignment. In such case it is always possible to use a function call, but this can be cumbersome and inelegant. For example, to pass conditionally different values as an argument for a constructor of a field or a base class, it is impossible to use a plain if-else statement; in this case we can use a conditional assignment expression, or a function call. Bear in mind also that some types allow initialization, but do not allow assignment, or even that the assignment operator and the constructor do totally different things. This last is true for reference types, for example: #include <iostream>
#include <fstream>
#include <string>
int main(int argc, char *argv[])
{
std::string name;
std::ofstream fout;
if (argc > 1 && argv[1])
{
name = argv[1];
fout.open(name.c_str(), std::ios::out | std::ios::app);
}
std::ostream &sout = name.empty() ? std::cout : fout;
sout << "Hello, world!\n";
return 0;
}
In this case, using an if-else statement in place of the std::ostream* sout = &fout;
if (name.empty()) {
sout = &std::cout;
}
*sout << "Hello, world!\n";
In this simple example, the Furthermore, the conditional operator can yield an lvalue, i.e. a value to which another value can be assigned. Consider the following example: #include <iostream>
int main(int argc, char *argv[])
{
int a = 0;
int b = 0;
(argc > 1 ? a : b) = 1;
std::cout << "a: " << a
<< " b: " << b
<< '\n';
return 0;
}
In this example, if the boolean expression CFMLExample of the result = randRange(0,1) ? "heads" : "tails";
Roughly 50% of the time the Lucee, Railo, and ColdFusion 11-specificLucee, Railo, and ColdFusion 11 also implement the Elvis operator, Syntax: result = expression ?: value_if_expression_is_null
Example: result = f() ?: "default";
// where...
function f(){
if (randRange(0,1)){ // either 0 or 1 (false / true)
return "value";
}
}
writeOutput(result);
The function CoffeeScriptExample of using this operator in CoffeeScript: if 1 is 2 then "true value" else "false value"
Returns "false value". 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))
CrystalExample of using this operator in Crystal: 1 == 2 ? "true value" : "false value"
Returns The Crystal compiler transforms conditional operators to if 1 == 2
"true value"
else
"false value"
end
DartThe Dart programming language's syntax belongs to the C family, primarily inspired by languages like Java, C# and JavaScript, which means it has inherited the traditional Example: return x.isEven ? x ~/ 2 : x * 3 + 1;
Like other conditions in Dart, the expression before the The Dart syntax uses both { x as T ? [1] : [2] }
could be parsed as either a "set literal" containing one of two lists or as a "map literal" Dart also has a second ternary operator, the DelphiIn Delphi the Using function IfThen(AValue: Boolean; const ATrue: Integer; const AFalse: Integer): Integer;
function IfThen(AValue: Boolean; const ATrue: Int64; const AFalse: Int64): Int64;
function IfThen(AValue: Boolean; const ATrue: UInt64; const AFalse: UInt64): UInt64;
function IfThen(AValue: Boolean; const ATrue: Single; const AFalse: Single): Single;
function IfThen(AValue: Boolean; const ATrue: Double; const AFalse: Double): Double;
function IfThen(AValue: Boolean; const ATrue: Extended; const AFalse: Extended): Extended;
Using the function IfThen(AValue: Boolean; const ATrue: string; AFalse: string = ''): string;
Usage example: function GetOpeningTime(Weekday: Integer): Integer;
begin
{ This function will return the opening time for the given weekday: 12 for Sundays, 9 for other days }
Result := IfThen((Weekday = 1) or (Weekday = 7), 12, 9);
end;
Unlike a true ternary operator however, both of the results are evaluated prior to performing the comparison. For example, if one of the results is a call to a function which inserts a row into a database table, that function will be called whether or not the condition to return that specific result is met. EiffelThe original Eiffel pure OO language from 1986 did not have conditional expressions. Extensions to Eiffel to integrate the style and benefits of functional in the form of agents (closely associated with functional lambdas) were proposed and implemented in 2014. if <boolean expression> then <expression> else <expression> opening_time: INTEGER
opening_time := if day = Sunday then 12 else 9
F#In F# the built-in syntax for if-then-else is already an expression that always must return a value. let num = if x = 10 then 42 else 24
F# has a special case where you can omit the else branch if the return value is of type unit. This way you can do side-effects, without using an else branch. if x = 10 then
printfn "It is 10"
But even in this case, the if expression would return unit. You don't need to write the else branch, because the compiler will assume the unit type on else. FORTHSince FORTH is a stack-oriented language, and any expression can leave a value on the stack, all : test ( n -- n ) 1 AND IF 22 ELSE 42 THEN ;
This word takes 1 parameter on the stack, and if that number is odd, leaves 22. If it's even, 42 is left on the stack. 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 has added conditional expressions which evaluate one or the other of the expressions based on the conditional expression: variable = ( a > b ? x : y )
FreeMarkerThis built-in exists since FreeMarker 2.3.20. Used like <#assign x = 10>
<#assign y = 20>
<#-- Prints the maximum of x and y: -->
${(x > y)?then(x, y)}
GoThere is no ternary if in Go, so use of the full if statement is always required.[7] HaskellThe built-in if-then-else syntax is inline: the expression if predicate then expr1 else expr2
has type Bool -> a -> a -> a
The base library also provides the function bool :: a -> a -> Bool -> a
In both cases, no special treatment is needed to ensure that only the selected expression is evaluated, since Haskell is non-strict by default. This also means an operator can be defined that, when used in combination with the (?) :: Bool -> a -> a -> a
(?) pred x y = if pred then x else y
infix 1 ?
-- example (vehicle will evaluate to "airplane"):
arg = 'A'
vehicle = arg == 'B' ? "boat" $
arg == 'A' ? "airplane" $
arg == 'T' ? "train" $
"car"
However, it is more idiomatic to use pattern guards -- example (vehicle will evaluate to "airplane"):
arg = 'A'
vehicle | arg == 'B' = "boat"
| arg == 'A' = "airplane"
| arg == 'T' = "train"
| otherwise = "car"
JavaIn Java this expression evaluates to: // If foo is selected, assign selected foo to bar. If not, assign baz to bar.
Object bar = foo.isSelected() ? foo : baz;
Note that Java, in a manner similar to C#, only evaluates the used expression and will not evaluate the unused expression.[8] JuliaIn Julia, "Note that the spaces around JavaScriptThe conditional operator in JavaScript is similar to that of C++ and Java, except for the fact the middle expression cannot be a comma expression. Also, as in C++, but unlike in C or Perl, it will not bind tighter than an assignment to its right— var timeout = settings === null ? 1000 : settings.timeout;
Just like C# and Java, the expression will only be evaluated if, and only if, the expression is the matching one for the condition given; the other expression will not be evaluated. LispAs the first functional programming language, Lisp naturally has conditional expressions since there are no statements and thus not conditional statements. The form is: (if test-expression then-expression else-expression)
Hence: (if (= day 'Sunday) 12 9)
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 behaviour of its -- equivalent to var = cond ? a : b;
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: -- parentheses around the table literal are required
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
Objective-Ccondition ? value_if_true : value_if_false int min = (1 < 2) ? 1 : 2;
This will set the variable 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. PerlA traditional if-else construct in Perl is written: if ($a > $b) {
$result = $x;
} else {
$result = $y;
}
Rewritten to use the conditional operator: $result = $a > $b ? $x : $y;
The precedence of the conditional operator in Perl is the same as in C, not as in C++. This is conveniently of higher precedence than a comma operator but lower than the precedence of most operators used in expressions within the ternary operator, so the use of parentheses is rarely required.[13] Its associativity matches that of C and C++, not that of PHP. Unlike C but like C++, Perl allows the use of the conditional expression as an L-value;[14] for example: $a > $b ? $x : $y = $result;
will assign The respective precedence rules and associativities of the operators used guarantee that the version absent any parentheses is equivalent to this explicitly parenthesized version: (($a > $b) ? $x : $y) = $result;
This is equivalent to the if-else version: if ($a > $b) {
$x = $result;
} else {
$y = $result;
}
PHPA simple PHP implementation is this: $abs = $value >= 0 ? $value : -$value;
Unlike most other programming languages, the conditional operator in PHP is left associative rather than right associative. Thus, given a value of T for arg, the PHP code in the following example would yield the value horse instead of train as one might expect:[15] <?php
$arg = "T";
$vehicle = ( ( $arg == 'B' ) ? 'bus' :
( $arg == 'A' ) ? 'airplane' :
( $arg == 'T' ) ? 'train' :
( $arg == 'C' ) ? 'car' :
( $arg == 'H' ) ? 'horse' :
'feet' );
echo $vehicle;
The reason is that nesting two conditional operators produces an oversized condition with the last two options as its branches: <?php
$arg = "T";
$vehicle = $arg == "B" ? "bus" :
($arg == "A" ? "airplane" :
($arg == "T" ? "train" :
($arg == "C" ? "car" :
($arg == "H" ? "horse" :
"feet"))));
echo $vehicle;
This will produce the result of train being printed to the output, analogous to a right associative conditional operator. PowershellIn versions before Powershell 7 ternary operators are not supported [18] however conditional syntax does support single line assignment: $result = if $a -eq $b {"was true" } else {"was false"}
In Powershell 7+ traditional ternary operators are supported and follow the C# syntax:[19] $result = $a -eq $b ? "was true" : "was false"
PythonThough it had been delayed for several years by disagreements over syntax, an 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 Prior to Python 2.5 there were a number of ways to approximate a conditional operator (for example by indexing into a two element array), all of which have drawbacks as compared to the built-in operator. RThe traditional if-else construct in R (which is an implementation of S) is: if (a < b) {
x <- "true"
} else {
x <- "false"
}
If there is only one statement in each block, braces can be omitted, like in C: if (a < b)
x <- "true"
else
x <- "false"
The code above can be written in the following non-standard condensed way: x <- if (a < b) "true" else "false"
There exists also the function x <- ifelse(a < b, "true", "false")
The > ifelse(c (0, 2) < 1, "true", "false")
[1] "true" "false"
RakuRaku uses a doubled $result = $a > $b ?? $x !! $y;
RubyExample of using this operator in Ruby: 1 == 2 ? "true value" : "false value"
Returns "false value". A traditional if-else construct in Ruby is written:[22] if a > b
result = x
else
result = y
end
This could also be written as: result = if a > b
x
else
y
end
These can be rewritten as the following statement: result = a > b ? x : y
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,
};
SchemeSame as in Common Lisp. Every expression has a value. Thus the builtin (let* ((x 5)
(y (if (= 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;
MySQLIn addition to the standard IF(cond, a, b);
SQL ServerIn addition to the standard IIF(condition, true_value, false_value)
Oracle SQLIn addition to the standard -- General syntax takes case-result pairs, comparing against an expression, followed by a fall-back result:
DECODE(expression, case1, result1,
...
caseN, resultN,
resultElse)
-- We can emulate the conditional operator by just selecting one case:
DECODE(expression, condition, true, false)
The SwiftThe ternary conditional operator of Swift is written in the usual way of the C tradition, and is used within expressions. let result = a > b ? a : b
TclIn Tcl, this operator is available in set x 5
set y [expr {$x == 5 ? 10 : 15}]
Outside of package require math
set x 5
set y [if {$x == 5} {
::math::random $x
} else {
::math::fibonacci $x
}]
TestStandIn a National Instruments TestStand expression, if condition is true, the first expression is evaluated and becomes the output of the conditional operation; if false, the second expression is evaluated and becomes the result. Only one of two expressions is ever evaluated. condition ? first_expression : second_expression
For example: RunState.Root.Parameters.TestSocket.Index == 3 ? Locals.UUTIndex = 3 : Locals.UUTIndex = 0
Sets the Similar to other languages, first_expression and second_expression do not need to be autonomous expressions, allowing the operator to be used for variable assignment: Locals.UUTIndex = ( RunState.Root.Parameters.TestSocket.Index == 3 ? 3 : 0 )
V (Vlang)V uses if expressions instead of a ternary conditional operator:[25] num := 777
var := if num % 2 == 0 { "even" } else { "odd" }
println(var)
VerilogVerilog is technically a hardware description language, not a programming language though the semantics of both are very similar. It uses the // using blocking assignment
wire out;
assign out = sel ? a : b;
This is equivalent to the more verbose Verilog code: // using blocking assignment
wire out;
if (sel === 1) // sel is 1, not 0, x or z
assign out = a;
else if (sel === 0) // sel is 0, x or z (1 checked above)
assign out = b;
else // sel is x or z (0 and 1 checked above)
assign out = [comment]; // a and b are compared bit by bit, and return for each bit
// an x if bits are different, and the bit value if the same
Visual BasicVisual Basic doesn't use ' variable = IIf(condition, value_if_true, value_if_false)
Dim opening_time As Integer = IIf((day = SUNDAY), 12, 9)
In the above example, Dim name As String = If(person Is Nothing, "", person.Name)
Using Visual Basic Version 9 has added the operator The syntaxes of the tokens are similar: ZigZig uses if-else expressions instead of a ternary conditional operator:[26] const result = if (a != b) 47 else 3089;
Result typeClearly the type of the result of the number = spell_out_numbers ? "forty-two" : 42;
will result in a compile-time error in most compilers. ?: in style guidelinesConditional operators are widely used and can be useful in certain circumstances to avoid the use of an #define MAX(a, b) (((a)>(b)) ? (a) : (b)) or for (i = 0; i < MAX_PATTERNS; i++)
c_patterns[i].ShowWindow(m_data.fOn[i] ? SW_SHOW : SW_HIDE);
(The latter example uses the Microsoft Foundation Classes Framework for Win32.) InitializationAn important use of the conditional operator is in allowing a single initialization statement, rather than multiple initialization statements. In many cases this also allows single assignment and for an identifier to be a constant. The simplest benefit is avoiding duplicating the variable name, as in Python: x = 'foo' if b else 'bar'
instead of: if b:
x = 'foo'
else:
x = 'bar'
More importantly, in languages with block scope, such as C++, the blocks of an if/else statement create new scopes, and thus variables must be declared before the if/else statement, as: 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 (formally, of const std::string s = b ? "foo" : "bar";
Case selectorsWhen properly formatted, the conditional operator can be used to write simple and coherent case selectors. For example: vehicle = arg == 'B' ? bus :
arg == 'A' ? airplane :
arg == 'T' ? train :
arg == 'C' ? car :
arg == 'H' ? horse :
feet;
Appropriate use of the conditional operator in a variable assignment context reduces the probability of a bug from a faulty assignment as the assigned variable is stated just once as opposed to multiple times. Programming languages without the conditional operatorThe following are examples of notable general-purpose programming languages that don't provide a conditional operator:
See also
References
External links |
Portal di Ensiklopedia Dunia