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

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

— Ага.