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

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

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

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

— Ага.

Комментарии (25)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Denis Odesskiy Уровень 47
24 июля 2024
Не понял, а где оператор XOR (исключающее или) ^ ?
17 мая 2024
То что нужно в конце квеста о Коллекциях😐👍
Андрей Уровень 42
28 апреля 2023
ну ёптвоюмать, было же это, проходили. на что тратится время? и задачи конченные.
Denis Rogov Уровень 1 Expert
15 марта 2023
чисто развели на 30 futerDollars
Lyokha Blagodatskikh Уровень 48
26 января 2023
Этот бы урок уровней 30 назад...
Майкл Мэдсен Уровень 51
6 сентября 2022
почему (true && false) == false ?
Anonymous #3127985 Уровень 48
8 сентября 2022
Ну так между ними стоит логический оператор "и"
Виктор Уровень 1
23 октября 2022
потому что && это умножение фактически: 1 x 0 = 0
Mikhail Уровень 41
19 февраля 2022
Ну нормально так, чё. А теперь решим следующую задачу и закрепим навыки применения класса TransferThreadExceptionSuperThisBuffered и его 1001 метода.
Дмитрий Уровень 46
15 августа 2022
и почему мне так смешно,поднял настроение комментом)
hidden #2595317 Уровень 45
27 января 2022
Не урок, а урочище!!!
22 сентября 2021
Так интересно ты решаешь быстрее чем написано и ответ правильный - это радует очень сильно .
Баба-Яга Уровень 40
16 июля 2021
Про лень можно было и раньше сообщить - это важно