Логічні оператори - 1

— Привіт, Аміго!

Зараз буде невелика лекція про логічних операторів.

Які логічні оператори ти знаєш?

— OR (||), AND (&&), NOT(!)

— Ага. Молодець. А ти пам'ятаєш, як вони працюють?

— Так:

OR дає в результаті true, коли є хоча б один true

AND дає true, коли обидва true.

NOT змінює true на false, а false на true.

— Правильно. А в якому порядку виконуються оператори у такому вираженні?

boolean a = true;
boolean b = false;
boolean c = true;

boolean result = a && b | !c && b | !a;

— Тут все дуже просто.

Спочатку виконується операція NOT(!) , потім AND(&&), а в самому кінці OR(||).

Тобто. якщо додати дужки, то в нас вийде:

boolean a = true;
boolean b = false;
boolean c = true;

boolean result = (a &b) || ((!c) &&b) || (!a);

— Все правильно, молодець. І якою ж буде відповідь?

— 1) (a &&b) == (true &&false) == false

2) ((!c) && b) == (false && false) == false

3) (!a) == false

4) false || false || false == false

Відповідь – false.

— А ти, виявляється, добре знаєш тему. Тоді я розкрию тобі кілька маленьких секретів.

По-перше, логічні вирази обчислюються зліва направо.

По-друге, тут працює принцип лінивих обчислень (обчислень лише за необхідності). Якщо при обчисленні частини виразу відповідь вже й так зрозуміла, то решта виразу не обчислюється.

Приклад
boolean result = (true && false)< /span> || (true && true) || (true &&false);

Такий вираз розбитий на три частини, розділені знаком OR(||).

Якщо хоча б одна частина буде true, то відповідь буде true і далі можна нічого не рахувати. Тому такий вираз обчислюється так:

1) обчислюємо першу частину: (true && false) == false

2) обчислюємо другу частину: (true && true) == true

3) третину ми не обчислюємо, т.к. вже ясно, що відповідь буде true.

Такий підхід ще називають лінивими обчисленнями.

— Ок. І що тут такого особливого?

— Нічого, поки не починаєш викликати методи всередині умови. Якщо частина умови пропускається, то й методи не викликатимуться.

Але такий підхід отримав дуже поширене застосування ось чому:

Приклад
Job job = null;

if (job!=null && job.isDone())
{
…
}

Якщо під час перевірки за умови job дорівнює null, то виклик job.isDone() не відбудеться!

— Дійсно, перша частина виразу дорівнює false, а потім іде AND(&&), отже, весь вираз вже дорівнює false і другу його частину обчислювати не обов'язково.

— Саме. Гарний підхід, так?

— Ага.