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

Логические операторы языка Java выполняются только с операндами типа boolean.

Следующая таблица перечисляет логические операторы языка Java:

Операция     Описание
& Логическая операция И (AND) или конъюнкция
| Логическая операция ИЛИ (OR) или дизъюнкция
^ Логическая операция исключающее ИЛИ (XOR)
! Логическая унарная операция НЕ (NOT)
|| Укороченная логическая операция ИЛИ (short-circuit)
&& Укороченная логическая операция И (short-circuit)
== Равенство
!= Неравенство
&= Логическая операция И с присваиванием
|= Логическая операция ИЛИ с присваиванием
^= Логическая операция исключающее ИЛИ с присваиванием

1. Логические операторы OR, AND, XOR, NOT.

Начнем с операций OR(|), AND(&), XOR(^), NOT(!). Операторы OR, AND, XOR являются бинарными - они требуют два оператора. NOT - это унарный оператор, только один оператор участвует в операции. Результаты выполнения этих логических операций представлены в следующей таблице:

A     B A|B A&B
A^B
!A
false false false false false true
true false true false true false
false true true false true true
true true true true false false

OR (|) - результат будет true, если хотя бы одно значение равно trueПример: для того, чтобы забрать ребенка из садика, должна прийти либо мать, либо отец, либо оба - в любом случае результат будет положительный. Если же никто не придет, ребенка не заберут - результат будет отрицательный.

AND (&) - результат будет true, только если и A, и B равны true. Пример: для того чтобы свадьба состоялась, и невеста (A) и жених (B) должны явиться на бракосочетание, иначе оно не состоится.

XOR (^) - результат будет true, только если или A равно true, или В равно true. Пример: у двух друзей на двоих один велосипед, поездка на велосипеде состоится только если один из них поедет на нем. Вдвоем они ехать не могут. 

NOT (!) - инвертирование значения. Если значение было true, то станет false, и наоборот.

Рассмотрим пример использования логических операторов:

public class BooleanLogic1 {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;
        boolean c = a | b;
        boolean d = a & b;
        boolean e = a ^ b;
        boolean f = (!a & b) | (a & !b);
        boolean g = !a;
        System.out.println("a = " + a);
        System.out.println("b = " + b);
        System.out.println("a | b = " + c);
        System.out.println("a & b = " + d);
        System.out.println("a ^ b = " + e);
        System.out.println("(!a & b) | (a & !b) = " + f);
        System.out.println("!a = " + g);
    }
}

2. Укороченные логические операторы (short-circuit).

Чаще всего в языке Java используются так называемые укороченные логические операторы (short-circuit):

||   -  Укороченный логический оператор ИЛИ
&&  - Укороченный логический оператор И

Правый операнд сокращенных операций вычисляется только в том случае, если от него зависит результат операции, то есть если левый операнд конъюнкции имеет значение true, или левый операнд дизъюнкции имеет значение false.

В формальной спецификации языка Java укороченные логические операции называются условными.

В следующем примере правый операнд логического выражения вычисляться не будет, так как условие d!=0 не выполняется и нет смысла дальше вычислять это выражение:

public class BooleanLogic2 {
    public static void main(String[] args) {
        int d = 0;
        int num = 10;
        if (d != 0 && num / d > 10) {
            System.out.println("num = " + num);
        }
    }
}

Если же логическое выражение переписать как d != 0 & num / d > 10, то правое выражение вычисляться будет. И в этом случае программа выбросит исключение времени выполнения с сообщением - на ноль делить нельзя.

Если нам надо сравнить возможный диапазон значений для какой-то переменной, например - a<x<b, такое условие разбивается на два: a<x &&x<b:

public class BooleanLogic3 {
    public static void main(String[] args) {
        int a = 1;
        int b = 2;
        int x = 3;
        System.out.print(a < x && x < b);
       // System.out.print(a < x < b);//Ошибка компиляции
    }
}

3. Операции ==, !=.

Здесь все просто - чтобы сравнить два значения типа boolean, можно использовать знаки == (проверка на равенство) и != (проверка на неравенство):

public class BooleanLogic4 {
    public static void main(String[] args) {
        boolean b1 = true;
        boolean b2 = false;
        System.out.println(b1 == b2);
        System.out.println(b1 != b2);
    }
}

4. Операции с присваиванием.

Также существуют операции с присваиванием для AND, OR, XOR. Посмотрим пример:

public class BooleanLogic5 {
    public static void main(String[] args) {
        boolean b1 = true;
        boolean b2 = true;
        b1 &= b2;//равносильно b1 = b1 & b2;
        System.out.println(b1);
        b1 |= b2; //равносильно b1 = b1 | b2;
        System.out.println(b1);
        b1 ^= b2; //равносильно b1 = b1 ^ b2;
        System.out.println(b1);
    }
}
Read also:
Comments