Elementor Header #8

45. Логические операторы

1. Введение

Логические операторы в Java используются для выполнения операций над булевыми значениями (true или false). Эти операторы часто применяются в условных выражениях и циклах для контроля выполнения программы в зависимости от определённых условий.

2. Основные логические операторы

В Java существует три основных логических оператора:

  1. Конъюнкция (AND): &&
  2. Дизъюнкция (OR): ||
  3. Отрицание (NOT): !

Эти операторы позволяют комбинировать булевые выражения и получать новые булевые значения.

3. Оператор && (AND)

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

Пример:

				
					public class Main {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;

        // Оператор AND
        boolean result = a && b; // false, так как один из операндов равен false
        System.out.println("Result of a && b: " + result);
    }
}

				
			

4. Оператор || (OR)

Оператор || возвращает true, если хотя бы один из операндов равен true. Результат будет false только в том случае, если оба операнда равны false.

Пример:

				
					public class Main {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;

        // Оператор OR
        boolean result = a || b; // true, так как один из операндов равен true
        System.out.println("Result of a || b: " + result);
    }
}

				
			

5. Оператор ! (NOT)

Оператор ! инвертирует значение операнда. Если операнд равен true, результат будет false, и наоборот.

Пример:

				
					public class Main {
    public static void main(String[] args) {
        boolean a = true;

        // Оператор NOT
        boolean result = !a; // false, так как a равно true
        System.out.println("Result of !a: " + result);
    }
}

				
			

6. Комбинирование логических операторов

Логические операторы можно комбинировать для создания более сложных логических выражений. При этом важно учитывать порядок выполнения операторов.

Пример:

				
					public class Main {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;
        boolean c = true;

        // Комбинирование логических операторов
        boolean result = a && (b || c); // true, так как b || c равно true, а a равно true
        System.out.println("Result of a && (b || c): " + result);
    }
}

				
			

В этом примере сначала вычисляется выражение b || c, которое возвращает true, а затем результат этого выражения используется в операции && с a.

7. Ленивая (короткозамкнутая) оценка

Java применяет короткозамкнутую (или ленивую) оценку для логических операторов && и ||. Это означает, что если результат можно определить, рассмотрев только первый операнд, второй операнд не будет оценен.

Пример:

				
					public class Main {
    public static void main(String[] args) {
        boolean a = false;

        // Второй операнд не будет вычислен, так как первый операнд уже определяет результат
        boolean result = a && (5 / 0 == 0); // false, несмотря на деление на ноль во втором операнде
        System.out.println("Result of a && (5 / 0 == 0): " + result);
    }
}

				
			

В этом примере выражение (5 / 0 == 0) не будет вычислено, так как первый операнд a уже равен false, и результат выражения a && ... будет false независимо от второго операнда.

8. Распространенные ошибки при использовании логических операторов

8.1 Ошибка: Пропуск скобок при комбинировании операторов

Проблема:

Если скобки пропущены или неправильно расставлены, это может привести к ошибкам в порядке выполнения выражений.

Пример:

				
					public class Main {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;
        boolean c = false;

        // Ошибка: неправильно расставлены скобки
        boolean result = a && b || c; // результат будет зависеть от порядка выполнения операторов
        System.out.println("Result of a && b || c: " + result);
    }
}

				
			

Решение:

Используйте скобки для явного определения порядка выполнения операторов.

Правильный код:

				
					public class Main {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;
        boolean c = false;

        // Правильное использование скобок
        boolean result = a && (b || c); // порядок выполнения операторов теперь явно определен
        System.out.println("Result of a && (b || c): " + result);
    }
}

				
			

8.2 Ошибка: Неправильное использование оператора !

Проблема:

Инвертирование сложных выражений без должного внимания к скобкам может привести к неожиданным результатам.

Пример:

				
					public class Main {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;

        // Ошибка: инвертирование сложного выражения
        boolean result = !a && b; // инвертируется только a, а не всё выражение
        System.out.println("Result of !a && b: " + result);
    }
}

				
			

Решение:

Инвертируйте выражения полностью, используя скобки.

Правильный код:

				
					public class Main {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;

        // Правильное использование оператора !
        boolean result = !(a && b); // инвертируется всё выражение
        System.out.println("Result of !(a && b): " + result);
    }
}

				
			

Заключение

Логические операторы являются важным инструментом для контроля выполнения программы. Используя операторы &&, || и !, можно создавать сложные условия и выражения. Важно понимать порядок выполнения операций и избегать распространенных ошибок, чтобы ваш код был правильным и предсказуемым.

9. Тестовое задание

  1. Напишите программу, которая принимает три булевых значения a, b и c и выводит результат следующих выражений:

    • a && b || c
    • !(a || b) && c
    • a || (b && !c)
  2. Объясните, как короткозамкнутая оценка влияет на выполнение этих выражений.

Пример решения:

				
					public class Main {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;
        boolean c = true;

        // Выражения
        boolean result1 = a && b || c;
        boolean result2 = !(a || b) && c;
        boolean result3 = a || (b && !c);

        // Вывод результатов
        System.out.println("Result of a && b || c: " + result1); // true
        System.out.println("Result of !(a || b) && c: " + result2); // false
        System.out.println("Result of a || (b && !c): " + result3); // true
    }
}

				
			

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

logo