1. Введение
Давайте начнем с бытовой аналогии. Представьте себе рецепт:
Смешайте муку, яйца и сахар взбейте добавьте масло взбейте еще раз.
Выглядит странно? А теперь представьте, что между словами "взбейте" и "добавьте" стоит запятая или скобки. Порядок действий сразу становится яснее.
В программировании похожая ситуация возникает, когда вы пишете сложное выражение:
bool result = a > 0 && b < 10 || c == 3;
Какой порядок? Что вычисляется первым: a > 0 && b < 10, потом || c == 3? Или всё наоборот? Без чёткого порядка вычислений компьютер может "перепутать ингредиенты" и ваш результат будет неожиданным.
2. Приоритет операторов в C#
C# (как и большинство языков программирования) использует определённую таблицу приоритетов операторов.
Операторы с более высоким приоритетом выполняются раньше, чем операторы с низким приоритетом.
Посмотрите на самую важную часть этой таблицы (для условных выражений):
| Оператор | Описание | Приоритет |
|---|---|---|
| () | Скобки | самый высокий |
| ! | Логическое "НЕ" | высокий |
| ==, != | Равно / не равно | средний |
| <, >, <=, >= | Сравнения | средний |
| && | Логическое "И" | ниже |
| || | Логическое "ИЛИ" | ещё ниже |
(Есть ещё арифметические операторы — они выше логических по приоритету.)
Главное правило
Операторы "И" (&&) имеют больший приоритет, чем "ИЛИ" (||),
то есть сначала будет вычислен "И", потом "ИЛИ".
Блок-схема вычисления приоритета условий
На практике: a > 0 && b < 10 || c == 3 — сначала считается a > 0 && b < 10, потом результат сравнивается с c == 3 через ||.
3. Направление операторов: слева направо и наоборот
Кроме приоритета, есть ещё такое слово: ассоциативность.
Это правило, в каком направлении вычисляются операторы, если они стоят "рядом" и имеют один приоритет.
Пример:
bool a = true, b = false, c = true;
bool result = a && b && c;
Вопрос: как посчитается?
Ответ: ассоциативность у && — слева направо.
Значит, сначала a && b, потом результат с c.
Применительно к условиям:
| Оператор | Ассоциативность |
|---|---|
| &&, || | слева направо |
| ! | справа налево |
4. Скобки — ваш лучший друг в сложных условиях
Вот здесь начинается магия (и спасение). Когда вы пишете выражение, скобки меняют приоритет и делают ваш код понятнее и безопаснее.
Пример 1 (без скобок):
// Мы хотим: "Если пользователь взрослый и гражданин, или если у него есть спецпропуск"
bool isAdult = age >= 18;
bool isCitizen = country == "Беларусь";
bool hasPermit = hasSpecialPass == true;
if (isAdult && isCitizen || hasPermit)
{
Console.WriteLine("Доступ разрешён!");
}
Как считает C#:
Сначала вычисляет isAdult && isCitizen, потом результат сравнивает по || с hasPermit.
- Допустим, isAdult = true, isCitizen = false, hasPermit = true
isAdult && isCitizen→true && false→falsefalse || true→true
То есть, если у человека спецпропуск, всё равно пропустят.
А если без спецпропуска, но взрослый гражданин — тоже пропустят.
Пример 2 (со скобками):
if (isAdult && (isCitizen || hasPermit))
{
Console.WriteLine("Доступ разрешён!");
}
Теперь программа сначала проверяет:
isCitizen || hasPermit, а затем этот результат вместе с isAdult.
То есть вам нужно быть взрослым и (или гражданином, или иметь спецпропуск).
Маленькая разница в скобках — огромная разница в логике!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ