1. Вступ
Почнемо з побутової аналогії. Уявіть рецепт:
Змішай борошно, яйця й цукор, збий, додай масло, збий ще раз.
Виглядає дивно, чи не так? А тепер уявіть, що між словами «збий» і «додай» стоїть кома або дужки. Тоді порядок дій одразу стає зрозумілішим.
У програмуванні схожа ситуація виникає, коли ви пишете складний вираз:
boolean result = a > 0 && b < 10 || c == 3;
Який порядок обчислення? Що обчислюється першим: a > 0 && b < 10, а потім || c == 3? Чи навпаки?
Без чіткого порядку обчислень компʼютер може «переплутати інгредієнти», і результат вийде неочікуваним.
2. Пріоритет операторів у Java
Java (як і більшість мов програмування) використовує усталену таблицю пріоритетів операторів.
Оператори з вищим пріоритетом виконуються раніше за оператори з нижчим пріоритетом.
Подивіться на найважливішу частину цієї таблиці (для умовних виразів):
| Оператор | Опис | Пріоритет |
|---|---|---|
|
Дужки | найвищий |
|
Логічне «НЕ» | високий |
|
Дорівнює / не дорівнює | середній |
|
Порівняння | середній |
|
Логічне «І» | нижчий |
|
Логічне «АБО» | ще нижчий |
(Є ще арифметичні оператори — вони мають вищий пріоритет, ніж логічні.)
Головне правило
Оператори «І» (&&) мають вищий пріоритет, ніж «АБО» (||),
тобто спочатку обчислюється «І», потім — «АБО». Недаремно «І» — логічне множення, а «АБО» — додавання.
Блок‑схема обчислення пріоритетів умов
graph LR
A["a > 0"] --&&--> B["b < 10"]
B --||--> C["c == 3"]
(На практиці: a > 0 && b < 10 || c == 3 — спочатку обчислюється a > 0 && b < 10, потім результат обʼєднується з c == 3 через ||.)
3. Напрямок операторів: зліва направо і справа наліво
Окрім пріоритету, є ще поняття «асоціативність».
Це правило визначає, у якому напрямку обчислюються оператори, якщо вони стоять поруч і мають однаковий пріоритет.
Приклад:
boolean a = true, b = false, c = true;
boolean result = a && b && c;
Питання: як це обчислюється?
Відповідь: асоціативність оператора && — зліва направо.
Отже, спочатку обчислюється a && b, а потім отриманий результат поєднується з c.
Стосовно умов:
| Оператор | Асоціативність |
|---|---|
|
зліва направо |
|
справа наліво |
4. Дужки — ваш найкращий друг у складних умовних виразах
Тут починається магія — і порятунок. Коли ви пишете вираз, дужки змінюють пріоритет і роблять код зрозумілішим та безпечнішим.
Приклад 1 (без дужок):
// Припустімо, що нам потрібно пропускати користувача, якщо він дорослий і громадянин або має спецперепустку
boolean isAdult = age >= 18;
boolean isCitizen = country.equals("Україна");
boolean hasPermit = hasSpecialPass == true;
if (isAdult && isCitizen || hasPermit)
{
System.out.println("Доступ дозволено!");
}
Як обчислює Java:
Спочатку обчислює isAdult && isCitizen, потім результат поєднує через || з hasPermit.
- Припустімо: isAdult = true, isCitizen = false, hasPermit = true
- isAdult && isCitizen → true && false → false
- false || true → true
Тобто якщо людина має спецперепустку, її пропустять у будь‑якому разі.
Якщо ж спецперепустки немає, але це дорослий громадянин — також пропустять.
Приклад 2 (з дужками):
if (isAdult && (isCitizen || hasPermit))
{
System.out.println("Доступ дозволено!");
}
Тепер програма спочатку перевіряє isCitizen || hasPermit, а вже тоді поєднує цей результат із isAdult.
Отже, потрібно бути дорослим і водночас або громадянином, або мати спецперепустку.
Невелика різниця в дужках — величезна різниця в логіці!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ