Conditional operator

Last updated

The conditional operator is supported in many programming languages. This term usually refers to ?: as in C, C++, C#, JavaScript and PHP. However, in Java, this term can also refer to && and ||.

Contents

&& and ||

In some programming languages, e.g. Java, the term conditional operator refers to short circuit boolean operators && and ||. The second expression is evaluated only when the first expression is not sufficient to determine the value of the whole expression. [1]

Difference from bitwise operator

& and | are bitwise operators that occur in many programming languages. The major difference is that bitwise operations operate on the individual bits of a binary numeral, whereas conditional operators operate on logical operations. Additionally, expressions before and after a bitwise operator are always evaluated.

if(expression1||expression2||expression3)

If expression 1 is true, expressions 2 and 3 are NOT checked.

if(expression1|expression2|expression3)

This checks expressions 2 and 3, even if expression 1 is true.

Short circuit operators can reduce run times by avoiding unnecessary calculations. They can also avoid Null Exceptions when expression 1 checks whether an object is valid.

Usage in Java

classConditionalDemo1{publicstaticvoidmain(String[]args){intvalue1=1;intvalue2=2;if((value1==1)&&(value2==2))System.out.println("value1 is 1 AND value2 is 2");if((value1==1)||(value2==1))System.out.println("value1 is 1 OR value2 is 1");}}

"?:"

In some 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?expression1:expression2

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] The exception is PHP, in which it was left-associative prior to version 8, and is non-associative thereafter. [4]

Examples by languages

Java
classConditionalDemo2{publicstaticvoidmain(String[]args){intvalue1=1;intvalue2=2;intresult;booleansomeCondition=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>intmain(){intx=1;inty=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. [5]
C#
// condition ? first_expression : second_expression;staticdoublesinc(doublex){returnx!=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
varage=26;varbeverage=(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. [6]

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. [5]

Examples by languages

JavaScript
functionexample(){returncondition1?value1:condition2?value2:condition3?value3:value4;}// Equivalent to:functionexample(){if(condition1){returnvalue1;}elseif(condition2){returnvalue2;}elseif(condition3){returnvalue3;}else{returnvalue4;}}
C/C++
constdoublea=expression1?a1:expression2?a2:expression3?a3:/*otherwise*/a4;// Equivalent to:doublea;if(expression1)a=a1;elseif(expression2)a=a2;elseif(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. [7]

C/C++

((foo)?bar:baz)=frink;// equivalent to:if(foo)bar=frink;elsebaz=frink;

See also

References

  1. "Equality, Relational, and Conditional Operators (The Java™ Tutorials > Learning the Java Language > Language Basics)". docs.oracle.com. Retrieved 2019-04-29.
  2. 1 2 3 BillWagner. "?: Operator - C# Reference". docs.microsoft.com. Retrieved 2019-04-29.
  3. "The ? : operator in Java". www.cafeaulait.org. Retrieved 2019-04-29.
  4. https://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary
  5. 1 2 mikeblome. "Conditional Operator: ?". docs.microsoft.com. Retrieved 2019-04-29.
  6. "Conditional (ternary) operator - JavaScript". developer.mozilla.org. Retrieved 2019-04-29.
  7. "Conditional Operator". wiki.c2.com. Retrieved 2019-04-29.