— Приветствую, Амиго! Я так увлекся решением логических задачек, что не заметил как ты пришёл. Вот одна для тебя: если крокодилы летают, то снег — белый. Вон летает крокодил. Какой вывод?
— Эмм… Значит, снег — белый?
— Отлично. Тест-инициация пройден. Ты готов усвоить следующую тему. Называется она “Логические операции”. И начнём мы с булевой логики. Инстинктивно ты и так её знаешь. Ты же робот. Только нужно подкрутить твои настройки под язык 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)) |
Примеры использования операторов сравнения и булевых переменных
— Запомни, Амиго: там, где можно написать логическое выражение, можно написать и логическую переменную.
— Это как?
— Я имею в виду, что ты можешь записывать логические выражения по-разному. Например:
Код | Пояснение |
---|---|
|
Если значение age лежит между 18 и 65 , на экран выводится текст «вы можете работать». |
|
Мы создали переменную isYoung и вынесли в нее первую часть выражения. Только заменили age >= 18 на age < 18 . |
|
Мы создали переменную 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 |