— Привіт, Аміго!
Зараз буде невелика лекція про логічних операторів.
Які логічні оператори ти знаєш?
— 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 і другу його частину обчислювати не обов'язково.
— Саме. Гарний підхід, так?
— Ага.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ