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

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

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

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

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


person Miquel    schedule 22.06.2012    source источник
comment
Я не понимаю смысла этого вопроса, вы задаете вопрос, на который сами отвечаете, прежде чем кто-либо еще сможет ответить?   -  person Nim    schedule 22.06.2012
comment
@ Ним и Дюрандаль: Хм... Возможно, я упустил суть, но согласно это на самом деле нормально отвечать на свои вопросы, если вы считаете, что это может быть важно для других. Я решил свой собственный вопрос и подумал, что поделюсь, поэтому я потрудился задокументировать его здесь. Не хотел никого обидеть   -  person Miquel    schedule 22.06.2012
comment
@Miquel, дело не в оскорблении, имхо, дело в том, что вы сразу же ответили на вопрос, который создает впечатление, что вы пытаетесь нафармить репутацию циникам (таким как я! :)), уделите немного времени в следующий раз, чтобы увидеть, что сообщество производит, а если не находите подходящего ответа, вносите свой вклад - то оно удаляет всякое такое появление...   -  person Nim    schedule 22.06.2012
comment
@Ним, хорошо, понял. Очевидно, это было неверно истолковано, так что в будущем я поступлю так, как вы предлагаете, а пока перенесу обсуждение в мету. Возможно, нам не нужно было отвечать на свой вопрос прямо под полем, чтобы опубликовать вопрос.   -  person Miquel    schedule 22.06.2012
comment
Я не понимаю, в чем дело. Может быть, Микелю не нужно было ждать весь день, чтобы закончить то, что он пытался сделать. Если бы я был в такой ситуации и у меня уже было достаточное решение моего вопроса, я бы не стал ждать просто так.   -  person Stack Underflow    schedule 03.02.2015


Ответы (5)


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

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

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

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, и, следовательно, оценка останавливается. Ошибка второго оператора печати, так как это не короткое замыкание, и встречается деление на ноль.

person arshajii    schedule 22.06.2012

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

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

Вот удобный код, подтверждающий это:

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;
    }
}
person Miquel    schedule 22.06.2012
comment
Итак, есть ли практическое применение оператора & в операторе if? - person eaglei22; 10.07.2018
comment
Единственным смыслом в его использовании было бы выполнение обоих предложений в качестве побочного эффекта, и я бы посчитал это очень плохой идеей, поскольку вам, вероятно, не следует полагаться на побочные эффекты в if в первую очередь, и это очень легко ошибиться - person Miquel; 11.07.2018

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

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

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

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

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

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

person Ahmad    schedule 22.06.2012

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

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

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

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

person Pramod Kumar    schedule 22.06.2012

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

person Rajeev jha    schedule 27.05.2015