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

What is the difference between & and && in Java?

В чем разница между & и && в Java?

Я всегда думал, что && оператор в Java используется для проверки того, являются ли оба его логических операнда true, а & оператор используется для выполнения побитовых операций над двумя целочисленными типами.

Недавно я узнал, что & operator также можно использовать для проверки того, являются ли оба его логических операнда true, с той лишь разницей, что он проверяет операнд RHS, даже если операнд LHS равен false.

Оператор & в Java внутренне перегружен? Или за этим стоит какая-то другая концепция?

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

& <-- проверяет оба операнда
&& <-- прекращает вычисление, если первый операнд принимает значение false, поскольку результат будет false

(x != 0) & (1/x > 1) <-- это означает вычислять, (x != 0) затем вычислять, (1/x > 1) затем выполнять & . проблема в том, что при x = 0 это вызовет исключение.

(x != 0) && (1/x > 1) <-- это означает evaluate (x != 0) и только если это верно, то evaluate (1/x > 1) поэтому, если у вас x = 0, то это совершенно безопасно и не вызовет никаких исключений, если (x != 0) принимает значение false, все это напрямую принимает значение false без вычисления (1/x > 1).

Редактировать:

exprA | exprB <-- это означает вычислять , exprA затем вычислять, exprB затем выполнять |.

exprA || exprB <-- это означает оценивать exprA и только если это так , то false затем оценивайте exprB и выполняйте ||.

Ответ 2

Помимо того, что я не являюсь ленивым вычислителем, вычисляя оба операнда, я думаю, что основные характеристики побитовых операторов сравнивают каждый байт операндов, как в следующем примере:

int a = 4;
int b = 7;
System.out.println(a & b); // prints 4
//meaning in an 32 bit system
// 00000000 00000000 00000000 00000100
// 00000000 00000000 00000000 00000111
// ===================================
// 00000000 00000000 00000000 00000100
Ответ 3
boolean a, b;

Operation Meaning Note
--------- ------- ----
a && b logical AND short-circuiting
a || b logical OR short-circuiting
a & b boolean logical AND not short-circuiting
a | b boolean logical OR not short-circuiting
a ^ b boolean logical exclusive OR
!a logical NOT

short-circuiting (x != 0) && (1/x > 1) SAFE
not short-circuiting (x != 0) & (1/x > 1) NOT SAFE
Ответ 4

Это зависит от типа аргументов...

Для целочисленных аргументов одинарный амперсанд ("&") является "побитовым оператором AND". Двойной амперсанд ("&&") не определен ни для чего, кроме двух логических аргументов.

Для логических аргументов одиночный амперсанд представляет собой (безусловный) оператор "логическое И", в то время как двойной амперсанд ("&&") является оператором "условное логическое И". Это означает, что одиночный амперсанд всегда вычисляет оба аргумента, тогда как двойной амперсанд будет вычислять второй аргумент только в том случае, если первый аргумент имеет значение true.

Для всех других типов аргументов и комбинаций должна возникать ошибка времени компиляции.

java