Приоритет операторов 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