Вопрос-ответ

Why do we usually use || over |? What is the difference?

Почему мы обычно используем || over |? В чем разница?

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

Я имею в виду, посмотрите на следующее:

if(true  | true)  // pass
if(true | false) // pass
if(false | true) // pass
if(false | false) // no pass
if(true  || true)  // pass
if(true || false) // pass
if(false || true) // pass
if(false || false) // no pass

Можем ли мы использовать | вместо ||? То же самое с & и &&.

Переведено автоматически
Ответ 1

Если вы используете формы || and &&, а не формы этих операторов | and &, Java не будет утруждать себя вычислением только правого операнда.

Вопрос в том, хотите ли вы сократить вычисление или нет - в большинстве случаев, когда вы этого хотите.

Хорошим способом проиллюстрировать преимущества короткого замыкания было бы рассмотреть следующий пример.

Boolean b = true;
if(b || foo.timeConsumingCall())
{
//we entered without calling timeConsumingCall()
}

Еще одним преимуществом, как упоминали Джереми и Питер, при коротком замыкании является проверка нулевой ссылки:

if(string != null && string.isEmpty())
{
//we check for string being null before calling isEmpty()
}

Подробная информация

Ответ 2

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

Кроме того, | может использоваться для выполнения побитовой операции OR над значениями byte/short/int/long . || не может.

Ответ 3

Итак, чтобы развить другие ответы на примере, короткое замыкание имеет решающее значение в следующих защитных проверках:

if (foo == null || foo.isClosed()) {
return;
}

if (bar != null && bar.isBlue()) {
foo.doSomething();
}

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

Ответ 4

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

Например:

int i = 12;
if (i == 10 & i < 9) // It will check if i == 10 and if i < 9
...

Перепишите это:

int i = 12;
if (i == 10 && i < 9) // It will check if i == 10 and stop checking afterward because i != 10
...

Другой пример:

int i = 12;
if (i == 12 | i > 10) // It will check if i == 12 and it will check if i > 10
...

Перепишите это:

int i = 12;
if (i == 12 || i > 10) // It will check if i == 12, it does, so it stops checking and executes what is in the if statement
...
java