JavaRush/Курсы/Java Multithreading/Логические операторы

Логические операторы

Открыта
Логические операторы - 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) || (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 и вторую его часть вычислять не обязательно.

— Именно. Хороший подход, да?

— Ага.

Комментарии (26)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
3 сентября, 11:48
Карикатура - про Трампа?
Denis Odesskiy Full Stack Developer
24 июля 2024, 22:23
Не понял, а где оператор XOR (исключающее или) ^ ?
17 мая 2024, 17:24
То что нужно в конце квеста о Коллекциях😐👍
Андрей
Уровень 42
28 апреля 2023, 16:42
ну ёптвоюмать, было же это, проходили. на что тратится время? и задачи конченные.
Denis Rogov
Уровень 1
Expert
15 марта 2023, 05:51
чисто развели на 30 futerDollars
Lyokha Blagodatskikh
Уровень 48
26 января 2023, 06:27
Этот бы урок уровней 30 назад...
Майкл Мэдсен
Уровень 51
6 сентября 2022, 06:23
почему (true && false) == false ?
Anonymous #3127985Отец господ в Tinkoff.ru
8 сентября 2022, 12:12
Ну так между ними стоит логический оператор "и"
Виктор
Уровень 1
23 октября 2022, 12:57
потому что && это умножение фактически: 1 x 0 = 0
Mikhail
Уровень 1
19 февраля 2022, 07:05
Ну нормально так, чё. А теперь решим следующую задачу и закрепим навыки применения класса TransferThreadExceptionSuperThisBuffered и его 1001 метода.
ДмитрийСтудент в мгу(вмк)/мфюа
15 августа 2022, 18:08
и почему мне так смешно,поднял настроение комментом)
hidden #2595317
Уровень 45
27 января 2022, 14:40
Не урок, а урочище!!!
22 сентября 2021, 18:26
Так интересно ты решаешь быстрее чем написано и ответ правильный - это радует очень сильно .