Оператор ?
относится к числу самых примечательных в C#. Он представляет собой условный оператор и часто используется вместо определенных видов конструкций if-then-else
. Оператор ?
иногда еще называют тернарным, поскольку для него требуются три операнда. Ниже приведена общая форма этого оператора.
Выражение1 ? Выражение2 : Выражение3;
Здесь Выражение1
должно относиться к типу bool
, а Выражение2
и Выражение3
— к одному и тому же типу. Обратите внимание на применение двоеточия и его местоположение в операторе ?
.
Значение выражения ?
определяется следующим образом. Сначала вычисляется Выражение1
. Если оно истинно, то вычисляется Выражение2
, а полученный результат определяет значение всего выражения ?
в целом. Если же Выражение1
оказывается ложным, то вычисляется Выражение3
, и его значение становится общим для всего выражения ?
. Рассмотрим следующий пример, в котором переменной absval
присваивается значение переменной val
.
absval = val < 0 ? -val : val; // получить абсолютное значение переменной val
В данном примере переменной absval
присваивается значение переменной val
, если оно больше или равно нулю. Если же значение переменной val
отрицательно, то переменной absval
присваивается результат отрицания этого значения, что в итоге дает положительное значение.
Ниже приведен еще один пример применения оператора ?
. В данной программе одно число делится на другое, но при этом исключается деление на нуль.
// Исключить деление на нуль, используя оператор?,
using System;
class NoZeroDiv {
static void Main() {
int result;
for (int i = -5; i < 6; i++) {
result = i != 0 ? 100 / i : 0;
if (i != 0)
Console.WriteLine("100 / " + i + " равно " + result);
}
}
}
Выполнение этой программы дает следующий результат.
100 / -5 равно -20
100 / -4 равно -25
100 / -3 равно -33
100 / -2 равно -50
100 / -1 равно -100
100 / 1 равно 100
100 / 2 равно 50
100 / 3 равно 33
100 / 4 равно 25
100 / 5 равно 20
Обратите особое внимание на следующую строку из приведенной выше программы.
result = i != 0 ? 100 / i : 0;
В этой строке переменной result
присваивается результат деления числа 100 на значение переменной i
. Но это деление осуществляется лишь в том случае, если значение переменной i
не равно нулю. Когда же оно равно нулю, переменной result
присваивается значение, обнуляющее результат.
Присваивать переменной результат выполнения оператора ?
совсем не обязательно. Например, значение, которое дает оператор ?
, можно использовать в качестве аргумента при вызове метода. А если все выражения в операторе ?
относятся к типу bool
, то такой оператор может заменить собой условное выражение в цикле или операторе if
. В приведенном ниже примере программы выводятся результаты деления числа 100 только на четные, ненулевые значения.
// Разделить только на четные, ненулевые значения.
using System;
class NoZeroDiv2 {
static void Main() {
for (int i = -5; i < 6; i++)
if (i != 0 ? (i % 2 == 0) : false)
Console.WriteLine("100 / " + i + " равно " + 100 / i);
}
}
Обратите внимание на оператор if
в приведенной выше программе. Если значение переменной i
равно нулю, то оператор if
дает ложный результат. А если значение переменной i
не равно нулю, то оператор if
дает истинный результат, когда значение переменной i
оказывается четным, и ложный результат, если оно нечетное. Благодаря этому допускается деление только на четные и ненулевые значения. Несмотря на то, что данный пример служит лишь для целей демонстрации, подобные конструкции иногда оказываются весьма полезными.
Поразрядные составные операторы присваивания | Использование пробелов и круглых скобок |