Misplaced Pages

Conditional operator

Article snapshot taken from Wikipedia with creative commons attribution-sharealike license. Give it a read and then ask your questions in the chat. We can research this topic together.

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

&& 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.

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

class ConditionalDemo1 {
    public static void main(String args) {
        int value1 = 1;
        int value2 = 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 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.

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.

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).

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.
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.
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.

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.

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.

C/C++

((foo) ? bar : baz) = frink;
//equivalent to:
 if (foo)
		bar = frink;
 else
		baz = 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. ^ BillWagner. "?: Operator - C# Reference". docs.microsoft.com. Retrieved 2019-04-29.
  3. "The ? : operator in Java". www.cafeaulait.org. Retrieved 2019-04-29.
  4. ^ mikeblome. "Conditional Operator: ?". docs.microsoft.com. Retrieved 2019-04-29.
  5. "Conditional (ternary) operator - JavaScript". developer.mozilla.org. Retrieved 2019-04-29.
  6. "Conditional Operator". wiki.c2.com. Retrieved 2019-04-29.
Categories: