— Приветствую, Амиго! Я так увлекся решением логических задачек, что не заметил как ты пришёл. Вот одна для тебя: если крокодилы летают, то снег — белый. Вон летает крокодил. Какой вывод?

— Эмм… Значит, снег — белый?

— Отлично. Тест-инициация пройден. Ты готов усвоить следующую тему. Называется она “Логические операции”. И начнём мы с булевой логики. Инстинктивно ты и так её знаешь. Ты же робот. Только нужно подкрутить твои настройки под язык Java.

— Булева логика? Мне тут недавно рассказывали о типе boolean...

— Да, здесь есть прямая связь. Булевы выражения могут быть только true или false. И эта самая логика изучает выражения, которые true или false, их сочетания. Например, выражение 18 < 25 — всегда true, а 7 < 5 — всегда false. Выражение (i < 10) зависит от значения i. И если оно, например, равно true, мы можем попросить программу что-нибудь сделать.

— Ааа, я понял. Булевы выражения помогают делать не только логические выводы, но и развилки в программах.

— Именно так. Главное научиться их записывать. Скажем, в Java нельзя просто взять — и записать выражение 18 < age < 65. Оно будет синтаксически некорректным и программа не скомпилируется.

— Зато можно записать его так:

(18 < age) И (age < 65)

Разумеется, слова И на русском не подойдёт. Там будет логический оператор, который означает “И”, но пишется по-другому.

— В Java есть три логических оператора: AND (и), OR (или) и NOT (не).

Хорошая новость: используя скобки, можно построить логические выражения любой сложности.

Плохая новость: разработчики Java решили вместо слов and, or и not, использовать обозначения из языка C.

Внимание на экран:

Логический оператор Ожидание Реальность
И (∧) and &&
ИЛИ (∨) or ||
НЕ (¬) not !

— На самом деле всё не так плохо… Довольно лаконично. Я уже почти их запомнил.

— Вот и славно. Держи несколько примеров использования логических операторов в Java:

Выражение Расшифровка Пояснение
(0 < a) && (a < 100) (0 < a) and (a < 100) (0 < a) И (a < 100)
(!a) && (!b) (not a) and (not b) (НЕ a) И (НЕ b)
!(!a || !b) not((not a) or (not b)) НЕ((НЕ a) ИЛИ (НЕ b))

Примеры использования операторов сравнения и булевых переменных

— Запомни, Амиго: там, где можно написать логическое выражение, можно написать и логическую переменную.

— Это как?

— Я имею в виду, что ты можешь записывать логические выражения по-разному. Например:

Код Пояснение
int age = 35;
if (age >= 18 && age <= 65)
   System.out.println("Вы можете работать");
Если значение age лежит между 18 и 65, на экран выводится текст «вы можете работать».
int age = 35;
boolean isYoung = (age < 18);
if (!isYoung && age <= 65)
   System.out.println("Вы можете работать");
Мы создали переменную isYoung и вынесли в нее первую часть выражения. Только заменили age >= 18 на age < 18.
int age = 35;
boolean isYoung = (age < 18);
boolean isOld = (age > 65);
if (!isYoung && !isOld)
   System.out.println("Вы можете работать");
Мы создали переменную isOld и вынесли в нее вторую часть выражения. При этом заменили age <= 65 на age > 65.

— Эти три примера эквивалентны. Только во втором мы вынесли часть выражения из условия if в отдельную логическую переменную – isYoung. В третьем примере мы вынесли вторую часть выражения во вторую переменную — isOld. Кстати, по умолчанию значение логической переменной равно false.

— Я это запомню. Надеюсь.

Логическая арифметика

— А теперь вкратце пройдемся по логическим операциям. Они подчиняются очень простым и логичным (как может быть иначе!) правилам.

— Для начала давай посмотрим, как работает оператор OR, он же ИЛИ, он же ||, он же дизъюнкция.

Выражение Результат
true || true true
true || false true
false || true true
false || false false

— Можешь теперь подытожить, чему равен результат выражения a || b согласно таблице?

— Насколько я понял, результат выражения равен true (истина), если хотя бы одно значение, участвующее в выражении, равно true (истина). Если оба равны false, то результат false.

— Всё верно. Раз ты такой умный, посмотри ещё раз на табличку и представь, что false — это 0, а true — это 1. В таком случае тебе поведение оператора || ничего не напоминает из обычной арифметики?

— Эмм… Ну немного похоже на операцию сложения… Только вот 1 + 1 не равно 1.

— В каком-то смысле равно, если мы работаем только с 0 и 1. Но этим сейчас не заморачивайся. Главное, что ты уловил сходство операции OR со сложением. Так что теперь тебя не удивит тот факт, что эту операцию часто называют “Логическим сложением”.

— Понял.

— Теперь на сцене оператор AND, он же И, он же &&, он же конъюнкция.

Выражение Результат
true && true true
true && false false
false && true false
false && false false

— Вижу! Результат выражения равен true (истина) только если оба значения, которые участвуют в выражении, равны true (истина). В остальных случаях — всегда false (ложь).

— Молодец, Амиго, хватаешь на лету. А на что похоже из арифметики?

— На умножение!

— Точно. Поэтому здесь у нас “логическое умножение”.

— Оператор NOT, он же НЕ, он же !, он же инверсия.

Выражение Результат
!true false
!false true

— Ну, здесь всё совсем просто. Оператор меняет true на false и наоборот.

— Именно так. Вот тебе напоследок несколько полезных выражений:

Выражение Результат
m && !m false
m || !m true
!(a && b) !a || !b
!(a || b) !a && !b