JavaRush /Курси /C# SELF /Пріоритет операторів і дужки в умовах

Пріоритет операторів і дужки в умовах

C# SELF
Рівень 3 , Лекція 4
Відкрита

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 — спочатку обчислюється 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 && isCitizentrue && falsefalse
  • false || truetrue

Тобто якщо людина має спецдозвіл, її все одно пропустять.
А якщо спецдозволу немає, але людина — дорослий громадянин, її також пропустять.

Приклад 2 (з дужками):

if (isAdult && (isCitizen || hasPermit))
{
    Console.WriteLine("Доступ дозволено!");
}

Тепер програма спочатку обчислює:
isCitizen || hasPermit, а потім перевіряє цей результат разом з isAdult.

Тобто вам потрібно бути дорослим і (бути громадянином або мати спецдозвіл).
Маленька різниця у дужках — величезна різниця в логіці!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ