Jump to content

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

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

&& и || [ редактировать ]

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

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

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

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

"?:" [ редактировать ]

В большинстве языков программирования ?: называется условным оператором. Это тип тернарного оператора . Однако в большинстве ситуаций тернарный оператор относится именно к ?:, поскольку это единственный оператор, принимающий три операнда. [2]

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

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

Синтаксис [ править ]

condition ? expression 1 : expression 2

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

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

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

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

Свойство ассоциации [ править ]

Условный оператор правоассоциативен, то есть операции группируются справа налево. Например, выражение формы a ? б: в? d: e оценивается как ? б: (в?г:е). [2]

Примеры по языкам [ править ]

Ява [ править ]
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, если это делает ваш код более читабельным; например, когда выражения компактны и не имеют побочных эффектов (таких как присваивание).

С++ [ править ]
#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.
  • Если оба операнда имеют один и тот же определяемый пользователем тип, общим типом является этот тип. [4]
С# [ править ]
// 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 неявно преобразуются в этот тип, этот тип является типом условного выражения.
  • В противном случае тип выражения не может быть определен, и возникает ошибка времени компиляции. [2]
JavaScript [ править ]
var age = 26;
var beverage = (age >= 21) ? "Beer" : "Juice";
console.log(beverage); // "Beer"

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

Chrome , Edge , Firefox ), Internet Explorer , Opera , Safari , веб-просмотр Android, Chrome для Android , Edge Mobile , Firefox для Android (4), Opera для Android, Safari на IOS, Samsung Internet , Node.js. ( 1 [5]

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

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

Примеры по языкам [ править ]

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; }
}
Си/С++ [ править ]
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++, которому можно присвоить другое значение, но подавляющее большинство программистов считают этот стиль крайне плохим, хотя бы из-за неясности этого метода. [6]

Си/С++ [ править ]

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

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

См. также [ править ]

Ссылки [ править ]

  1. ^ «Операторы равенства, отношения и условные операторы (Учебные пособия по Java™ > Изучение языка Java > Основы языка)» . docs.oracle.com . Проверено 29 апреля 2019 г.
  2. Перейти обратно: Перейти обратно: а б с БиллВагнер. «?: Оператор — Справочник по C#» . docs.microsoft.com . Проверено 29 апреля 2019 г.
  3. ^ «Оператор ? : в Java» . www.cafeaulait.org . Проверено 29 апреля 2019 г.
  4. Перейти обратно: Перейти обратно: а б Майкблом. «Условный оператор: ? :» . docs.microsoft.com . Проверено 29 апреля 2019 г.
  5. ^ «Условный (тройной) оператор — JavaScript» . http://developer.mozilla.org . Проверено 29 апреля 2019 г.
  6. ^ «Условный оператор» . wiki.c2.com . Проверено 29 апреля 2019 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 1b71823ffe7756da5dc4650e2053b246__1702165500
URL1:https://arc.ask3.ru/arc/aa/1b/46/1b71823ffe7756da5dc4650e2053b246.html
Заголовок, (Title) документа по адресу, URL1:
Conditional operator - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)