Освоение приоритета и ассоциативности операторов в C#: практическое руководство
Освоение приоритета и ассоциативности операторов в C#
Это подробное руководство объясняет, как компилятор C# вычисляет выражения, применяя правила приоритета и ассоциативности операторов. Изучите тему на наглядных примерах и справочных таблицах.
Приоритет операторов в C#
Приоритет операторов определяет порядок вычисления частей выражения. У каждого оператора C# есть фиксированный уровень приоритета, что обеспечивает согласованную обработку выражений компилятором.
Например, оператор умножения * имеет более высокий приоритет, чем сложение +. Поэтому в выражении:
int x = 4 + 3 * 5;
сначала выполняется умножение, в результате x = 19.
Если бы сложение имело приоритет над умножением, результат был бы 35, но C# следует установленной иерархии приоритетов.
Таблица приоритета операторов
В таблице ниже операторы перечислены от высшего к низшему приоритету.
| Категория | Операторы |
|---|---|
| Постфиксный инкремент и декремент | |
| Префиксный инкремент, декремент и унарные | |
| Мультипликативные | |
| Аддитивные | |
| Сдвиг | |
| Отношения | |
| Равенства | |
| Побитовое И | |
| Побитовое исключающее ИЛИ | |
| Побитовое ИЛИ | |
| Логическое И | |
| Логическое ИЛИ | |
| Тернарный | |
| Присваивание |
Операции присваивания имеют наименьший приоритет, а постфиксные инкремент/декремент — наивысший.
Пример 1: Приоритет операторов
using System;
namespace OperatorDemo {
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
Порядок вычисления:
(--a)→ 4 (a становится 4)(++c)→ 5 (c становится 5)(a * b)→ 24- Вычитание: 24 - 5 = 19
Во втором выражении сложение + имеет более высокий приоритет, чем сравнение >=, поэтому c + a вычисляется перед сравнением.
Ассоциативность операторов в C#
Когда два оператора имеют одинаковый приоритет, компилятор использует ассоциативность для определения порядка вычисления. Большинство операторов C# ассоциативны слева направо, но некоторые — справа налево.
Пример:
int a = 5, b = 6, c = 3; int result = a * b / c;
Так как * и / ассоциативны слева направо, умножение выполняется первым, результат 10.
Правая ассоциативность критична в цепочках присваивания:
int a = 5, b = 6, c = 3; a = b = c;
Значение 3 присваивается b, затем b присваивается a, в итоге все переменные содержат 3.
Ниже приведена таблица ассоциативности операторов C#.
| Категория | Операторы | Ассоциативность |
|---|---|---|
| Постфиксный инкремент и декремент | Слева направо | |
| Префиксный инкремент, декремент и унарные | Справа налево | |
| Мультипликативные | Слева направо | |
| Аддитивные | Слева направо | |
| Сдвиг | Слева направо | |
| Отношения | Слева направо | |
| Равенства | Слева направо | |
| Побитовое И | Слева направо | |
| Побитовое исключающее ИЛИ | Слева направо | |
| Побитовое ИЛИ | Слева направо | |
| Логическое И | Слева направо | |
| Логическое ИЛИ | Слева направо | |
| Тернарный | Справа налево | |
| Присваивание | Справа налево |
Ключевые операторы с правой ассоциативностью: унарные префиксы, тернарный оператор и все операции присваивания.
Пример 2: Ассоциативность в действии
using System;
namespace OperatorDemo {
class OperatorAssociativity {
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 = {a}, b = {b}, c = {c}");
}
}
}
Вывод:
10 a = 3, b = 3, c = 3
Язык C
- Понимание ключевых слов и идентификаторов C#: правила, списки и лучшие практики
- Операторы C# — исчерпывающее руководство по операторам в C#
- Тернарный оператор в C#: краткое руководство по условным выражениям
- Классы и объекты в C#: Фундаменты надёжного ООП
- Абстрактные классы и методы в C#: практическое руководство
- Частичные классы и методы в C#: понимание и применение
- Sealed-классы и sealed-методы в C#: когда использовать, примеры и повышение безопасности кода
- Операторы в C++: типы, примеры и практические программы
- Константы и литералы в C: целочисленные, вещественные, символьные, строковые и определение констант
- Ввод-вывод в C: stdio.h, потоки stdin/stdout/stderr, функции getchar/putchar, gets/puts, scanf/printf