JavaRush /Курсы /Java Syntax New Beta /Логические операции

Логические операции

Java Syntax New Beta
3 уровень , 10 лекция
Открыта

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

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

— Отлично. Тест-инициация пройден. Ты готов усвоить следующую тему. Называется она “Логические операции”. И начнём мы с булевой логики. Инстинктивно ты и так её знаешь. Ты же робот. Только нужно подкрутить твои настройки под язык 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
Комментарии (18)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Максим Уровень 22 Expert
29 ноября 2022
ну на счёт догического умножения,то если минус на минус умножать то получится уже плюс ,итог будет true,ну а здесь всё равно получается false,так что конечно аналогия с умножением не понятна ;)
Anton Serhiyenka Уровень 6
22 декабря 2022
Причем тут минус ? Ассоциация идет на 1 - True и 0 - False. 1 x 1 - 1 (True) 0 x 1 - 0 (False) 1 x 0 - 0 (False) 0 x 0 - 0 (False)
Максим Уровень 22 Expert
22 декабря 2022
да,уже согласен )
worried-cell Уровень 24
10 июля 2022
В данном примере 3 строка. Оператор "!" перед скобками, меняет "&&" на "||" ? Не совсем понял этот пример честно говоря. Вроде если просто вычислить выражение в скобках "а && b" например "Истина", и просто инверсию применить, тогда выражение будет "Ложь"?
FelixDS Уровень 11
30 октября 2022
Правило де Моргана. Пример из книги: Одно временно Лета и Зимы не бывает: !(Лето И Зима). То есть у нас сейчас либо НЕ Лето либо НЕ Зима: !Лето ИЛИ !Зима
Рыбалко Иван Уровень 36
25 декабря 2021
Anonymous #3025762 Уровень 28
7 марта 2022
не работает
Anonymous #2515652 Уровень 0
25 марта 2021
странное чувство, когда читаешь лекцию и вспоминаешь, что задания к ней были в предыдущей
xseiter Уровень 11
4 апреля 2021
это наверно метод обучения такой, тут зачастую так. Суть в том, что бы самому додумывать надо (конечно если есть какие то познания, чего я не имею)
Jav@Men Уровень 35
16 марта 2021

А символ "&" тоже используется как значение "И"??
в предыдущих задачах использовал "&" и все сработало.
Евгений Уровень 21
29 апреля 2021
Где-то в комментариях к предыдущим лекциям/задачам читал, что использование && облегчает работу программы. Мол, двойной амперсанд, при наличии false слева от него, сразу выдает false в ответ, не чекая правую сторону.
Mary Ink Уровень 25
30 апреля 2021
Разница заключается в том, что && - это логическое "И", а & - побитовое "И". Побитовое "И" сравнивает бинарный код выражений слева и справа по одному биту, то есть сравнивает нули и единицы. Но последовптельность нулей и единиц может быть слишком длинной, поэтому конъюнкция будет проходить очень долго. Если подытожить, то && работает со ЗНАЧЕНИЯМИ, а & с ДВОИЧНЫМ КОДОМ.
ArtemG Уровень 43
5 февраля 2021
Мне кажется, что здесь в лекции допущена ошибка. Конъюнкция - это логическое умножение, а не сложение, а дизъюнкция - наоборот сложение, а не умножение.
Дима Сазонов Уровень 7
6 февраля 2021
согласен! тоже в этом моменте подумал что должно быть наоборот
hidden #2517453 Уровень 7
7 февраля 2021
конъюнкция в логике равняется значению "И" , а дизъюнкция в логике равняется "или"
Kotli Уровень 6
25 февраля 2021
Видимо поправили , потому что у меня в лекции конъюнкция отвечает за умножение , а дизъюнкция за сложение .
DMYTRO Уровень 21
22 августа 2020
Вообще логический оператор И(AND) это & а ИЛИ(OR) это | а && и || это сокращенные И и ИЛИ Conditional-And Operator && Conditional-Or Operator || https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22.2 Исправьте не вводите людей в заблуждение https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.22.2
Anonymous #2931973 Уровень 24
21 декабря 2021
Вот вот. Я у Шилдта тоже самое читал. & - это логическая операция И; && - это укороченное И. Разница в том, что при использовании укороченного И, сначала проверяется правое условие, если оно не выполняется, то левое условие не проверяется. Это справедливо при управлении оператором if. Про побитовое сравнение ни чего не слышал, может не внимательно читал книгу.