Я всегда думал, что && оператор в 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
Помимо того, что я не являюсь ленивым вычислителем, вычисляя оба операнда, я думаю, что основные характеристики побитовых операторов сравнивают каждый байт операндов, как в следующем примере:
inta=4; intb=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.
Для всех других типов аргументов и комбинаций должна возникать ошибка времени компиляции.