$ sudo teach IT
МОДУЛЬ 3 · УРОК 3

Логические операторы: &&, ||, !

Одного условия часто недостатко. Нужно проверить: «возраст >= 18 И есть билет И есть паспорт». Логические операторы позволяют комбинировать несколько условий в одно.

⏱ ~20 минут 🎓 Для начинающих 📌 Модуль 3

🔗 && — логическое И (AND)

&& возвращает true, только когда оба условия true. Если хотя бы одно false — результат false:

public class LogicalAnd {
    public static void main(String[] args) {
        int age = 25;
        boolean hasID = true;
        boolean hasTicket = true;

        // Все три условия должны быть true
        if (age >= 18 && hasID && hasTicket) {
            System.out.println("Добро пожаловать!");
        } else {
            System.out.println("Доступ запрещён");
        }

        // Пример с двумя условиями
        int temperature = 25;
        boolean isRaining = false;

        if (temperature > 20 && !isRaining) {
            System.out.println("Идеальная погода для прогулки");
        }
    }
}

Аналогия: && — это замок с двумя ключами. Оба ключа должны подойти, чтобы открыть.

Таблица истинности &&

A B A && B
truetruetrue
truefalsefalse
falsetruefalse
falsefalsefalse

🔗 || — логическое ИЛИ (OR)

|| возвращает true, если хотя бы одно условие true:

public class LogicalOr {
    public static void main(String[] args) {
        boolean isWeekend = true;
        boolean isHoliday = false;

        if (isWeekend || isHoliday) {
            System.out.println("Можно отдохнуть!");
        }

        // Проверка нескольких вариантов
        char grade = 'B';

        if (grade == 'A' || grade == 'B' || grade == 'C') {
            System.out.println("Вы сдали экзамен!");
        }
    }
}

Таблица истинности ||

ABA || B
truetruetrue
truefalsetrue
falsetruetrue
falsefalsefalse

🚫 ! — логическое НЕ (NOT)

! инвертирует boolean-значение:

boolean sunny = true;
boolean needUmbrella = !sunny;  // false — солнечно, зонт не нужен

int age = 15;
boolean isAdult = !(age >= 18);  // false — несовершеннолетний

⚡ Short-circuit evaluation подробно

Java использует ленивое вычисление:

public class ShortCircuit {
    public static void main(String[] args) {
        int x = 0;

        // && — если левая false, правая НЕ вычисляется
        boolean result1 = (x != 0) && (10 / x > 1);
        System.out.println(result1);  // false — без деления на ноль!

        // || — если левая true, правая НЕ вычисляется
        boolean result2 = (x == 0) || (10 / x > 1);
        System.out.println(result2);  // true — без деления на ноль!

        // Практический пример: проверка null перед обращением
        String text = null;
        // Безопасно: сначала проверяем на null
        if (text != null && text.length() > 0) {
            System.out.println("Строка не пустая");
        }
    }
}

💡 Паттерн: Ставьте «быстрые» и «безопасные» проверки первыми. list != null && list.size() > 0 — сначала null, потом size().

📐 Законы де Моргана

Математические правила, которые помогают упрощать логические выражения:

// Закон де Моргана 1: !(A && B) == (!A || !B)
boolean a = true;
boolean b = false;
System.out.println(!(a && b));   // true
System.out.println(!a || !b);   // true — то же самое!

// Закон де Моргана 2: !(A || B) == (!A && !B)
System.out.println(!(a || b));   // false
System.out.println(!a && !b);   // false — то же самое!

// Практическое применение:
// Упрощаем отрицание сложного условия
boolean age = true;
boolean hasTicket = false;
// Было: if (!(age && hasTicket)) {
// Стало: if (!age || !hasTicket) {
if (!age || !hasTicket) {
    System.out.println("Доступ запрещён");
}

✅ Итоги урока

  • && — оба должны быть true
  • || — хотя бы один должен быть true
  • ! — инвертирует значение
  • Short-circuit: правая часть не вычисляется, если результат определён
  • Законы де Моргана: !(A && B) = !A || !B, !(A || B) = !A && !B
  • Ставьте «быстрые» проверки первыми (null-проверки)

Далее: Тернарный оператор — компактная замена if-else →

Проверяем понимание

4 вопроса

Комбинированная проверка

Premium