VirQ. Тернарная операция ? : в C#
Язык C# входит в ТОП-5
самых популярных языков
программирования
Главная / Булевы переменные /
Тернарная операция ? :
Статей на сайте: 61

Тернарная операция ? :


Тернарная операция - это более сокращённый способ записи условий
Скажем, в обычном виде проверка положительного и отрицательного числа записывается так:
[code] int n = 12; if (n > 0) s = "Положительное"; if (n < 0) s = "Отрицательное"; [/code]
или через else:
[code] int n = 12; if (n > 0) s = "Положительное"; else s = "Отрицательное"; [/code]
В тернарной операции выглядит всё так:

Переменная = <условие> ? <если да> : <если нет>;

Пример:
[code] int n = 12; string s = n > 0 ? "Положительное" : "Отрицательное"; [/code]

Более странной на первый взгляд покажется запись с участием ==.
[code] //Обычная запись int n = 12; if (n == 0) s = "Это ноль"; else s = "Это не ноль"; //Тернарная запись int n = 12; string s = n == 0 ? "Это ноль" : "Это не ноль"; [/code]
Пусть запись "s = n == 0" не пугает, т.к. рассматривать её надо так:
если n == 0, тогда s = "Это ноль"

Условий может быть больше. В этом случае необходимо использовать операторы & и | ("и" и "или")

Например, если оба числа положительных, тогда вывести квадрат этих чисел, иначе написать, что есть ошибка:
[code] int n = 10; int m = 12; string s = n > 0 & m > 0 ? (n * m).ToString() : "Ошибка"; [/code]
Сперва проверяем условие (n > 0 и m > 0). Если да, тогда умножаем n на m. Потом конвертируем в строку ToString(), т.к. изначально надо было сохранить в строку s. Если же одно из чисел 0 или отрицательное - ошибка.
Такую задачу удобно использовать при подсчёте площади прямоугольника, где n и m - это числа, полученные от пользователя, из текстового документа или из любого другого источника.
Если игнорировать дополнительные проверки, тогда программа может внезапно "вылететь", как говорится, если ввод данных совершён неверно (отрицательная сторона прямоугольника, введены буквы вместо цифр или не введено вообще ничего)

Тернарные операции могут быть вложены друг в друга, но это может очень сильно запутать
[code] int n = 100; int m = 12; string s = n > 0 & m > 0 ? n * m > 1000 ? "Большой" : "Маленький" : "Ошибка"; [/code]
В данном случае, чтобы было видно, что к чему относится, укажу внутреннюю тернарную операции в скобках:
[code] int n = 100; int m = 12; string s = n > 0 & m > 0 ? (n * m > 1000 ? "Большой" : "Маленький") : "Ошибка"; [/code]
Т.е. здесь сперва срабатывает проверка, являются ли оба числа положительными. Если хоть одно из них 0 или отрицательное, выводится слово "Ошибка". Если же это оба числа, то производим умножение чисел. И тут срабатывает уже внутренняя тернарная операция n * m > 1000 ? "Большой" : "Маленький"
В данном случае идёт проверка, если площадь вышла более 1000, это Большой прямоугольник, в ином случае - Маленький

Тернарная операция гораздо удобнее по длине записи, но сложнее в восприятии, если есть вложенность. Вот как выглядит один и тот же код в разных вариациях:
[code] int n = 100; int m = 12; //Тернарная запись string s = n > 0 & m > 0 ? (n * m > 1000 ? "Большой" : "Маленький") : "Ошибка"; //Обычная запись через условия s = ""; if (n > 0 & m > 0) { if (n * m > 1000) s = "Большой"; else s = "Маленький"; } else s = "Ошибка"; //Обычная запись без {} s = ""; if (n > 0 & m > 0) if (n * m > 1000) s = "Большой"; else s = "Маленький"; else s = "Ошибка"; //Для большего удобства лучше так: s = ""; if (n > 0 & m > 0) if (n * m > 1000) s = "Большой"; else s = "Маленький"; else s = "Ошибка"; [/code]
Здесь фигурные скобки не нужны, т.к. внешний оператор условия if содержит только 1 строку кода внутри. if+else считается за 1 строку кода. Даже если они записаны в 2 строки.

Дополнительная информация о том, как вывести результат в консоли или WinForm