Подтвердить что ты не робот

Есть ли разница между использованием логического оператора или побитового оператора в блоке if в Java?

Содержимое обоих следующих блоков if должно быть выполнено:

if( booleanFunction() || otherBooleanFunction() ) {...}
if( booleanFunction() | otherBooleanFunction() ) {...}

Итак, какая разница между использованием | или использованием ||?

Примечание. Я изучил это и нашел свой собственный ответ, который я включил ниже. Пожалуйста, не стесняйтесь исправить меня или дать свое мнение. Уверен, что есть возможности для улучшения!

4b9b3361

Ответ 1

Логический оператор работает с булевыми операциями, а побитовый оператор работает с битами. В этом случае эффект будет таким же, но есть два отличия:

  • Побитовый оператор не предназначен для этого, что затрудняет чтение, но самое главное
  • Логический оператор OR будет оценивать первое условие. Если это правда, то не имеет значения, что приведет к следующему условию, результат будет истинным, поэтому второе предложение не выполняется.

Вот какой удобный код, чтобы доказать это:

public class OperatorTest {

    public static void main(String[] args){
        System.out.println("Logical Operator:");
        if(sayAndReturn(true, "first") || sayAndReturn(true, "second")){
            //doNothing
        }

        System.out.println("Bitwise Operator:");
        if(sayAndReturn(true, "first") | sayAndReturn(true, "second")){
            //doNothing
        }
    }

    public static boolean sayAndReturn(boolean ret, String msg){
        System.out.println(msg);
        return ret;
    }
}

Ответ 2

Оба имеют разные виды использования. Хотя во многих случаях (при работе с булевыми) может показаться, что они имеют одинаковый эффект, важно отметить, что логическое ИЛИ представляет собой короткое замыкание, что означает, что если его первый аргумент имеет значение true, то второй аргумент остается невычисленный. Побитовый оператор независимо оценивает оба его аргумента.

Аналогично, логическое-И является короткозамкнутым, что означает, что если его первый аргумент оценивается как false, то второй остается неоценимым. Опять же, побитовое - И нет.

Вы можете увидеть это в действии здесь:

int x = 0;
int y = 1;
System.out.println(x+y == 1 || y/x == 1);
System.out.println(x+y == 1 |  y/x == 1);

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

Ответ 3

для программистов, есть только одна разница.

  • ваши логические операторы являются логическими, т.е. они проверяют только одно условие и получают результат, основанный на этом.

booleanFunction() || otherBooleanFunction() будет true, если либо true. аналогично, booleanFunction() && otherBooleanFunction() будет false, если либо false. Итак, зачем тестировать другую. что делают логические операторы.

Но побитовые проверяют оба. Частое применение этой концепции заключается в следующем.

if(someObject != null && someObject.somemethod())

Итак, в этом случае, если вы замените && на &, дождитесь катастрофы. Скоро вы получите неприятное NullPointerException...

Ответ 4

if( booleanFunction() || otherBooleanFunction() ) {...}

В этом условии, если booleanFunction() возвращает true, тогда otherBooleanFunction() не будет выполняться.

if( booleanFunction() | otherBooleanFunction() ) {...}

Но в побитом операторе обе функции - booleanFunction() и otherBooleanFunction() выполняются независимо от того, booleanFunction() возвращает true или false

Ответ 5

Разница между побитовым логическим оператором d- 1. Побитовый оператор работает с битом, тогда как логический оператор работает с оператором. 2. Побитовое и представлено логическим и тогда представлено как & &. 3. Побитовое или представлено | тогда как логический или представлен ||.