Приоритет операторов C# и ассоциативность
Приоритет и ассоциативность операторов C#
В этом уроке вы узнаете о приоритете операторов и ассоциативности в C#. Это даст нам представление о том, как выражение оценивается компилятором C#.
Приоритет оператора C#
Приоритет оператора — это набор правил, определяющих, как вычисляется выражение. В C# каждому оператору C# назначается приоритет, и на основе этих приоритетов вычисляется выражение.
Например , приоритет умножения (*) оператор выше, чем приоритет добавления (+) оператор. Поэтому операция умножения выполняется перед сложением.
Взгляните на заявление ниже.
int x = 4 + 3 * 5;
Каким будет значение x после выполнения этого оператора?
Операнд 3 связан с + и * . Как было сказано ранее, умножение имеет более высокий приоритет, чем сложение. Итак, операция 3 * 5 выполняется вместо 4 + 3 . Значение переменной x будет 19 .
Если добавление будет иметь более высокий приоритет, 4 + 3 будет оцениваться первым, а значение x будет 35 .
Таблица приоритета операторов
Чем выше приоритет оператора, тем выше он появляется в таблице
| Категория | Операторы |
|---|---|
| Инкремент и декремент Postfix | ++, -- |
| Инкремент префикса, декремент и унарный | ++, --, +, -, !, ~ |
| Мультипликативный | *, /, % |
| Добавка | <тд>+, -тд>|
| Сдвиг | <тд><<,>>тд>|
| Относительный | <, <=,>,>= |
| Равенство | ==, != |
| Побитовое И | <тд>&тд>|
| Побитовое исключающее ИЛИ | <тд>^тд>|
| Побитовое ИЛИ | <тд>|тд>|
| Логическое И | <тд>&&тд>|
| Логическое ИЛИ | <тд>||тд>|
| Троичный | <тд>? :|
| Назначение | =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=,>>= |
Операторы присваивания имеют самый низкий приоритет, а постфиксные операторы инкремента и декремента имеют наивысший приоритет.
<час>Пример 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 False
Давайте разберемся, как выражение вычисляется в программе.
Приоритет -- и ++ выше, чем * и приоритет * выше, чем - . Отсюда утверждение,
result1 = --a * b - ++c;
эквивалентно
result1 = ((--a)*b)-(++c);
Выражение внутри круглых скобок всегда вычисляется первым, независимо от приоритета операторов за его пределами.
- Сначала (--a) оценивается, что приводит к
4.

- Затем (++c) оценивается, что приводит к
5.

- Теперь (a * b) оценивается, что приводит к
24.

- Наконец, выполняется вычитание, в результате чего получается
19.

- Следовательно, окончательное значение result1 будет
19.
В следующем выражении приоритет + выше, чем >= . Итак, с и а сначала добавляется и сумма сравнивается с 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; a = b = c;
Ассоциативность = оператор идет справа налево . Таким образом, значение c (например, 3 ) присваивается b , а затем значение b назначается a . Таким образом, после выполнения этого оператора значения a , б и с будет 3 .
В таблице ниже показана ассоциативность операторов C#:
| Категория | Операторы | Ассоциативность |
|---|---|---|
| Инкремент и декремент Postfix | ++, -- | Слева направо |
| Инкремент префикса, декремент и унарный | ++, --, +, -, !, ~ | Справа налево |
| Мультипликативный | *, /, % | Слева направо |
| Добавка | <тд>+, -тд>Слева направо | |
| Сдвиг | <тд><<,>>тд>Слева направо | |
| Относительный | <, <=,>,>= | Слева направо |
| Равенство | ==, != | Слева направо |
| Побитовое И | <тд>&тд>Слева направо | |
| Побитовое исключающее ИЛИ | <тд>^тд>Слева направо | |
| Побитовое ИЛИ | <тд>|тд>Слева направо | |
| Логическое И | <тд>&&тд>Слева направо | |
| Логическое ИЛИ | <тд>||тд>Слева направо | |
| Троичный | <тд>? :Справа налево | |
| Назначение | =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=,>>= | Справа налево |
Почти все операторы имеют ассоциативность слева направо. Операторы, имеющие ассоциативность справа налево:
- Унарные операторы
- Префиксные операторы увеличения и уменьшения
- Тернарный оператор
- Операторы присваивания
Пример 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 a = 3, b = 3, c = 3
Язык C