Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: MiquelОтветов: 5

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

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

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

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

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

javaoperatorslogical-operatorsbitwise-operators

Ответы

Ответ 1 · рейтинг 40 · arshajii

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

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

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

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

Ответ 2 · рейтинг 15 · Miquel

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

  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;
    }
}

Ответ 3 · рейтинг 7 · Ahmad

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

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

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

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

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

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

Ответ 4 · рейтинг 4 · Pramod Kumar

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

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

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

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

Ответ 5 · Rajeev jha

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы