Условный оператор - Conditional operator

Условный оператор поддерживается во многих языках программирования . Этот термин обычно обозначается ?:как в C, C ++, C # и JavaScript. Однако в Java этот термин также может относиться к &&и ||.

&& и ||

В некоторых языках программирования, например в Java, термин условный оператор относится к логическим операторам короткого замыкания && и ||. Второе выражение оценивается только тогда, когда первого выражения недостаточно для определения значения всего выражения.

Отличие от побитового оператора

&и |являются побитовыми операторами, которые встречаются во многих языках программирования. Основное отличие состоит в том, что побитовые операции работают с отдельными битами двоичного числа, тогда как условные операторы работают с логическими операциями. Кроме того, всегда вычисляются выражения до и после побитового оператора.

if (expression1 || expression2 || expression3)

Если выражение 1 истинно, выражения 2 и 3 НЕ проверяются.

if (expression1 | expression2 | expression3)

Это проверяет выражения 2 и 3, даже если выражение 1 истинно.

Операторы короткого замыкания могут сократить время работы, избегая ненужных вычислений. Они также могут избежать пустых исключений, когда выражение 1 проверяет, действителен ли объект.

Использование в 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");
    }
}

"?:"

В большинстве языков программирования ?: Называется условным оператором. Это тип тернарного оператора . Однако тернарный оператор в большинстве случаев относится конкретно к ?: Потому что это единственный оператор, который принимает три операнда.

Регулярное использование "?:"

?:используется в условных выражениях. Программисты могут более кратко переписать выражение if-then-else, используя условный оператор.

Синтаксис

condition ? expression 1 : expression 2

условие: выражение, которое оценивается как логическое значение.

выражение 1, выражение 2: выражения со значениями любого типа.

Если условие истинно, будет вычислено выражение 1. Если условие оценивается как ложное, будет оценено выражение 2.

Его следует читать так: «Если условие истинно, присвойте значение выражения 1 результату. В противном случае присвойте значение выражения 2 результату».

Собственность ассоциации

Условный оператор является правоассоциативным, что означает, что операции группируются справа налево. Например, выражение формы? До нашей эры ? d: e оценивается как a? b: (c? d: e).

Примеры по языкам

Джава
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);
    }
}

В этом примере, поскольку someCondition истинно, эта программа выводит на экран «1». Используйте оператор?: Вместо оператора if-then-else, если он делает ваш код более читабельным; например, когда выражения компактны и не имеют побочных эффектов (таких как присваивания).

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;
}

Есть несколько правил, которые применяются ко второму и третьему операндам в C ++:

  • Если оба операнда одного типа, результат будет того же типа.
  • Если оба операнда относятся к арифметическому или перечислимому типу, обычные арифметические преобразования (описанные в разделе Стандартные преобразования) выполняются для преобразования их в общий тип.
  • Если оба операнда относятся к типам указателей или если один является типом указателя, а другой является константным выражением, значение которого равно 0, выполняется преобразование указателя для преобразования их в общий тип.
  • Если оба операнда относятся к ссылочным типам, выполняется преобразование ссылок для преобразования их в общий тип.
  • Если оба операнда имеют тип void, общим типом является тип void
  • Если оба операнда относятся к одному и тому же определяемому пользователем типу, этот тип является общим.
C #
// condition ? first_expression : second_expression;

static double sinc(double x) 
{
    return x != 0.0 ? Math.Sin(x)/x : 1.0;
}

Есть несколько правил, которые применяются ко второму и третьему операндам x и y в C #:

  • Если x имеет тип X, а y имеет тип Y:
  • Если существует неявное преобразование из X в Y, но не из Y в X, Y - это тип условного выражения.
  • Если существует неявное преобразование из Y в X, но не из X в Y, X - это тип условного выражения.
  • В противном случае невозможно определить тип выражения и возникает ошибка времени компиляции.
  • Если только один из x и y имеет тип, и оба x и y неявно преобразуются в этот тип, этот тип является типом условного выражения.
  • В противном случае невозможно определить тип выражения и возникает ошибка времени компиляции.
JavaScript
var age = 26;
var beverage = (age >= 21) ? "Beer" : "Juice";
console.log(beverage); // "Beer"

Условный оператор JavaScript совместим со следующими браузерами:

Chrome , Край , Firefox (1), Internet Explorer , Opera , Safari , Android WebView, Chrome для Android , Гурт Mobile , Firefox для Android (4), Opera для Android, Safari на IOS, Samsung Интернет , Node.js .

Специальное использование в условной цепочке

Тернарный оператор является правоассоциативным, что означает, что его можно «связать» следующим образом, аналогично цепочке if ... else if ... else if ... else.

Примеры по языкам

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;

Специальное использование в выражении присваивания

условный оператор может дать L-значение в C / C ++, которому может быть присвоено другое значение, но подавляющее большинство программистов считают этот стиль чрезвычайно плохим хотя бы из-за неясности техники.

C / C ++

((foo) ? bar : baz) = frink;

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

Смотрите также

использованная литература