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.
Тобто вам потрібно бути дорослим і (бути громадянином або мати спецдозвіл).
Маленька різниця у дужках — величезна різниця в логіці!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ