Операторы (Руководство по программированию на C#)
В языке C# оператор — это элемент программы, который применяется для одного или нескольких операндов в выражении или инструкции. Операторы, в которых используется один операнд, например оператор инкремента (++) или new, называются унарными. Операторы, в которых используются два операнда, например арифметические операторы (+,-,*,/), называются бинарными. Для одного оператора — условного (?:) — используются три операнда, и такой оператор является единственным троичным оператором в C#.
Следующая строка кода C# содержит один унарный оператор и еще один операнд. Оператор инкремента ++ изменяет значение операнда y.
y++;
Следующая строка кода C# содержит два бинарных оператора с двумя операндами в каждом. Оператор присваивания = содержит в качестве операндов целочисленную переменную y и выражение 2 + 3. Выражение 2 + 3 состоит из оператора сложения и двух операндов — 2 и 3.
y = 2 + 3;
Операторы, вычисление выражений и приоритет операторов
Операнд может быть допустимым выражением, представляющим собой код любой длины, а также может содержать любое число вложенных выражений. В выражении, содержащем несколько операторов, порядок применения операторов определяется приоритетом операторов, ассоциативностью и скобками.
Каждый оператор имеет определенный приоритет. В выражении, содержащем несколько операторов с разными уровнями приоритета, порядок вычисления операторов определяется их приоритетом. Например, в следующем операторе переменной n1 присваивается значение 3.
n1 = 11 - 2 * 4;
Сначала выполняется умножение, так как оно имеет приоритет над вычитанием.
В следующей таблице операторы разделены на категории на основе типа выполняемых операций. Категории указаны в порядке приоритета.
Основные операторы
Выражение |
Описание |
---|---|
x.y |
Доступ к членам |
f(x) |
Вызов метода и делегата |
a[x] |
Доступ к массиву и индексатору |
x++ |
Постфиксный инкремент |
x-- |
Постфиксный декремент |
new T(...) |
Создание объекта и делегата |
new T(...){...} |
Создание объекта с инициализатором. См. раздел Инициализаторы объектов и коллекций (Руководство по программированию в C#). |
new {...} |
Анонимный инициализатор объекта. См. раздел Анонимные типы (Руководство по программированию в C#). |
new T[...] |
Создание массива. См. раздел Массивы (Руководство по программированию на C#). |
typeof(T) |
Получение объекта System.Type для T |
checked(x) |
Вычисление выражения в проверенном контексте |
unchecked(x) |
Вычисление выражения в непроверенном контексте |
default (T) |
Получение значения по умолчанию для типа T |
delegate {} |
Анонимная функция (анонимный метод) |
Унарные операторы
Выражение |
Описание |
---|---|
+x |
Удостоверение |
-x |
Отрицание |
!x |
Логическое отрицание |
~x |
Поразрядное отрицание |
++x |
Префиксный инкремент |
--x |
Префиксный декремент |
(T)x |
Явное преобразование x в тип T |
Мультипликативные операторы
Выражение |
Описание |
---|---|
Умножение |
|
Деление |
|
Остаток |
Аддитивные операторы
Выражение |
Описание |
---|---|
x + y |
Сложение, объединение строк, объединение делегатов |
x - y |
Вычитание, удаление делегатов |
Операторы сдвига
Выражение |
Описание |
---|---|
x << y |
Сдвиг влево |
x >> y |
Сдвиг вправо |
Операторы отношения и типа
Выражение |
Описание |
---|---|
x < y |
Меньше |
x > y |
Больше |
x <= y |
Меньше или равно |
x >= y |
Больше или равно |
x is T |
Возвращает значение true, если x относится к типу T, в противном случае возвращает значение false |
x as T |
Возвращает x типа T или значение NULL, если x не относится к типу T |
Операторы равенства
Выражение |
Описание |
---|---|
x == y |
Равно |
x != y |
Не равно |
Логические, условные операторы и NULL-операторы
Категория |
Выражение |
Описание |
---|---|---|
Логическое И |
x & y |
Поразрядное И для операндов целочисленного типа, логическое И для операндов логического типа |
Логическое исключающее ИЛИ |
x ^ y |
Поразрядное исключающее ИЛИ для операндов целочисленного типа, логическое исключающее ИЛИ для операндов логического типа |
Логическое ИЛИ |
x | y |
Поразрядное ИЛИ для операндов целочисленного типа, логическое ИЛИ для операндов логического типа |
Условное И |
x && y |
Равно y, только если x имеет значение true |
Условное ИЛИ |
x || y |
Равно y, только если x имеет значение false |
Объединение со значением NULL |
x ?? y |
Равно y, если x имеет значение NULL, в противном случае равно x |
Условие |
x ?: y : z |
Равно y, если x имеет значение true, и z, если x имеет значение false |
Операторы присваивания и анонимные операторы
Выражение |
Описание |
---|---|
Присваивание |
|
x op= y |
Составное присваивание. Поддерживает следующие операторы: +=, -=, *=, /=, %=, &=, |=, !=, <<=, >>=. |
(T x) => y |
Анонимная функция (лямбда-выражение) |
Ассоциативность
Когда выражение содержит два или более операторов с одинаковым приоритетом, они вычисляются на основе ассоциативности. Операторы с левой ассоциативностью вычисляются слева направо. Например, выражение x * y / z вычисляется как (x * y) / z. Операторы с правой ассоциативностью вычисляются справа налево. Например, оператор присваивания имеет правую ассоциативность. Если бы это было не так, следующий код вызвал бы ошибку.
int a, b, c;
c = 1;
// The following two lines are equivalent.
a = b = c;
a = (b = c);
// The following line, which forces left associativity, causes an error.
//(a = b) = c;
Другим примером оператора с правой ассоциативностью является троичный оператор (?:). Большинство двоичных операторов имеют левую ассоциативность.
Независимо от того, какую ассоциативность (левую или правую) имеют операторы в выражении, сначала вычисляются операнды каждого выражения — слева направо. В следующих примерах иллюстрируется порядок вычисления операторов и операндов.
Оператор |
Порядок вычислений |
---|---|
a = b |
a, b, = |
a = b + c |
a, b, c, +, = |
a = b + c * d |
a, b, c, d, *, +, = |
a = b * c + d |
a, b, c, *, d, +, = |
a = b - c + d |
a, b, c, -, d, +, = |
a += b -= c |
a, b, c, -=, += |
Добавление скобок
Порядок, определяемый приоритетом и ассоциативностью операторов, можно изменить с помощью скобок. Например, выражение 2 + 3 * 2 в обычном случае будет иметь значение 8, поскольку операторы умножения выполняются раньше операторов сложения. Однако если выражение записано в форме (2 + 3) * 2, сложение выполняется перед умножением и в результате получается 10. В следующих примерах иллюстрируется порядок вычисления выражений в скобках. Как и в предыдущих примерах, перед применением оператора вычисляются операнды.
Оператор |
Порядок вычислений |
---|---|
a = (b + c) * d |
a, b, c, +, d, *, = |
a = b - (c + d) |
a, b, c, d, +, -, = |
a = (b + c) * (d - e) |
a, b, c, +, d, e, -, *, = |
Перегрузка операторов
Поведение операторов для пользовательских классов и структур можно изменить. Такой процесс называется перегрузкой операторов. Для получения дополнительной информации см. Перегружаемые операторы (Руководство по программированию в C#).
Связанные разделы
Дополнительные сведения см. в разделах Ключевые слова операторов (Справочник по C#) и Операторы C#.
См. также
Ссылки
Операторы и выражения (Руководство по программированию на C#)