— Привет, Амиго!
Сейчас будет небольшая лекция о логических операторах.
Какие логические операторы ты знаешь?
— 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 и вторую его часть вычислять не обязательно.
— Именно. Хороший подход, да?
— Ага.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ