В этом руководстве вы узнаете о приоритете и ассоциативности операторов в C #. Это даст нам представление о том, как выражение оценивается компилятором C #.
Приоритет операторов C #
Приоритет оператора - это набор правил, который определяет, как оценивается выражение. В C # каждому оператору C # назначен приоритет, и на основе этих приоритетов вычисляется выражение.
Например , приоритет (*)
оператора умножения выше, чем приоритет (+)
оператора сложения . Поэтому операция умножения выполняется перед сложением.
Взгляните на заявление ниже.
интервал х = 4 + 3 * 5;
Каким будет значение x после выполнения этого оператора?
Операнд 3
связан с +
и *
. Как было сказано ранее, умножение имеет более высокий приоритет, чем сложение. Итак, операция 3 * 5
проводится вместо 4 + 3
. Значение переменной x будет 19
.
Если бы сложение имело более высокий приоритет, 4 + 3
сначала оценивалось бы, и значение x было бы 35
.
Таблица приоритета операторов
Чем выше приоритет оператора, тем выше он отображается в таблице
Приоритет операторов C #Категория | Операторы |
---|---|
Постфиксное увеличение и уменьшение | ++, - |
Приращение префикса, декремент и унарный | ++, -, +, -,!, ~ |
Мультипликативный | *, /,% |
Добавка | +, - |
сдвиг | <> |
Реляционный | <,,> = |
Равенство | ==,! = |
Побитовое И | & |
Побитовое исключающее ИЛИ | ^ |
Побитовое ИЛИ | | |
Логическое И | && |
Логическое ИЛИ | || |
Троичный | ? : |
Присвоение | =, + =, - =, * =, / =,% =, & =, | =, =, <> = |
Операторы присваивания имеют самый низкий приоритет, тогда как постфиксные операторы увеличения и уменьшения имеют самый высокий приоритет.
Пример 1: приоритет оператора
using System; namespace Operator ( class OperatorPrecedence ( public static void Main(string() args) ( int result1; int a = 5, b = 6, c = 4; result1 = --a * b - ++c; Console.WriteLine(result1); bool result2; result2 = b>= c + a; Console.WriteLine(result2); ) ) )
Когда мы запустим программу, вывод будет:
19 Ложь
Давайте разберемся, как вычисляется выражение в программе.
Приоритет --
и ++
выше *
, а приоритет *
выше, чем -
. Следовательно, утверждение,
результат1 = --a * b - ++ c;
эквивалентно
результат1 = ((--a) * b) - (++ c);
Выражение в круглых скобках всегда вычисляется первым, независимо от приоритета операторов вне его.
- Сначала вычисляется (--a), в результате чего получается
4
. - Затем вычисляется (++ c), в результате чего получается
5
. - Теперь вычисляется (a * b), в результате чего получается
24
. - Наконец, выполняется вычитание, в результате чего получается
19
. - Следовательно, окончательное значение result1 будет
19
.
В следующем выражении приоритет +
выше, чем >=
. Итак, сначала добавляются c и a, и полученная сумма сравнивается с b false
.
Ассоциативность операторов в C #
В предыдущем разделе мы обсуждали приоритет операторов. Если используются два оператора с разным приоритетом, сначала оценивается оператор с более высоким приоритетом.
Но что, если оба оператора имеют одинаковый приоритет?
В таком случае выражение оценивается на основе ассоциативности оператора (слева направо или справа налево).
Например:
int a = 5, b = 6, c = 3; int result = a * b / c;
Здесь оба *
и /
имеют одинаковый приоритет. Но поскольку ассоциативность этих операторов слева направо , a * b
сначала оценивается, а затем выполняется деление. Конечным результатом этого выражения будет 10
.
В этом конкретном примере ассоциативность не имеет особого значения. Потому что даже если бы деление производилось до умножения, результат не изменился бы.
Давайте посмотрим на другой пример.
int a = 5, b = 6, c = 3; а = б = с;
Ассоциативность =
оператора справа налево . Таким образом, значение c (т.е. 3
) присваивается b, а затем значение b присваивается a. Таким образом, после выполнения этого оператора значения a, b и c будут 3
.
В таблице ниже показана ассоциативность операторов C #:
C # Ассоциативность операторовКатегория | Операторы | Ассоциативность |
---|---|---|
Постфиксное увеличение и уменьшение | ++, - | Слева направо |
Приращение префикса, декремент и унарный | ++, -, +, -,!, ~ | Справа налево |
Мультипликативный | *, /,% | Слева направо |
Добавка | +, - | Слева направо |
сдвиг | <> | Слева направо |
Реляционный | <,,> = | Слева направо |
Равенство | ==,! = | Слева направо |
Побитовое И | & | Слева направо |
Побитовое исключающее ИЛИ | ^ | Слева направо |
Побитовое ИЛИ | | | Слева направо |
Логическое И | && | Слева направо |
Логическое ИЛИ | || | Слева направо |
Троичный | ? : | Справа налево |
Присвоение | =, + =, - =, * =, / =,% =, & =, | =, =, <> = | Справа налево |
Практически все операторы имеют ассоциативность слева направо. Операторы, обладающие ассоциативностью справа налево:
- Унарные операторы
- Операторы увеличения и уменьшения префикса
- Тернарный оператор
- Операторы присваивания
Пример 2: ассоциативность операторов
using System; namespace Operator ( class OperatorPrecedence ( public static void Main(string() args) ( int a = 5, b = 6, c = 3; int result = a * b / c; Console.WriteLine(result); a = b = c; Console.WriteLine("a = (0), b = (1), c = (2)", a, b, c); ) ) )
Когда мы запустим программу, вывод будет:
10 а = 3, б = 3, с = 3