나는 항상 &&
Java true
의 &
연산자가 부울 피연산자가 모두인지 여부를 확인하는 데 사용되고 연산자는 두 정수 유형에서 비트 단위 연산을 수행 하는 데 사용 된다고 생각했습니다 .
최근에 나는 &
연산자가 두 부울 피연산자가 모두인지 여부를 확인하는 데 사용될 수 있다는 것을 알게 되었으며 true
, 유일한 차이점은 LHS 피연산자가 false 인 경우에도 RHS 피연산자를 검사한다는 것입니다.
&
Java 의 연산자가 내부적으로 과부하 되었습니까? 아니면 이것 뒤에 다른 개념이 있습니까?
답변
& <-두 피연산자를 모두 확인합니다.
&& <-결과가 거짓이므로 첫 번째 피연산자가 false로 평가되면 평가를 중지합니다.
(x != 0) & (1/x > 1)
<-이 방법은 평가 (x != 0)
후 평가 (1/x > 1)
및 수행 한 후. 문제는 x = 0 인 경우 예외가 발생한다는 것입니다.
(x != 0) && (1/x > 1)
<-이것은 평가를 의미 (x != 0)
하고 이것이 참인 경우에만 평가 (1/x > 1)
하므로 x = 0이면 완벽하게 안전하며 (x! = 0)이 거짓으로 평가되면 예외가 발생하지 않습니다. 모든 것이 직접 거짓으로 평가됩니다 평가하지 않고 (1/x > 1)
.
편집하다:
exprA | exprB
<-이것은 평가 exprA
하고 평가 exprB
한 다음 수행하는 것을 의미 합니다 |
.
exprA || exprB
<-이 수단을 평가 exprA
하고이 경우에만 false
다음 평가 exprB
와 수행 ||
.
답변
두 피연산자를 모두 평가하여 지연 평가자가 아닌 비트 연산자의 주요 특성은 다음 예제와 같이 피연산자의 각 바이트를 비교한다고 생각합니다.
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
답변
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
답변
그것은 인수의 유형에 달려 있습니다 …
정수 인수의 경우 단일 앰퍼샌드 ( “&”)는 “비트 AND”연산자입니다. 이중 앰퍼샌드 ( “&&”)는 두 개의 부울 인수 외에는 정의되지 않습니다.
부울 인수의 경우 단일 앰퍼샌드는 (무조건) “논리 AND”연산자를 구성하고 이중 앰퍼샌드 ( “&&”)는 “조건부 논리 AND”연산자입니다. 즉, 단일 앰퍼샌드는 항상 두 인수를 모두 평가하지만 이중 앰퍼샌드는 첫 번째 인수가 참이면 두 번째 인수 만 평가합니다.
다른 모든 인수 유형 및 조합의 경우 컴파일 타임 오류가 발생합니다.
답변
&&는 단락 연산자이고 &는 AND 연산자입니다.
이 시도.
String s = null;
boolean b = false & s.isEmpty(); // NullPointerException
boolean sb = false && s.isEmpty(); // sb is false
답변
JLS (15.22.2)에 지정된 것과 같습니다.
&, ^ 또는 | 연산자는 부울 또는 부울 유형이고 비트 연산자 표현식의 유형은 부울입니다. 모든 경우에, 피연산자는 필요에 따라 언 박스 변환 (§5.1.8)을 받아야합니다.
&의 경우, 두 피연산자 값이 모두 참이면 결과 값은 참입니다. 그렇지 않으면 결과는 거짓입니다.
^의 경우, 피연산자 값이 다른 경우 결과 값은 true입니다. 그렇지 않으면 결과는 거짓입니다.
|의 경우, 두 피연산자 값이 모두 false 인 경우 결과 값은 false입니다. 그렇지 않으면 결과는 사실입니다.
은 “트릭은”즉 &
입니다 정수 비트 단위 연산자 뿐만 아니라 부울 논리 연산자 . 따라서 이것을 연산자 오버로드 의 예로 보는 것이 합리적입니다.
답변
내 대답이 더 이해하기 쉽다고 생각합니다.
&
와 사이에는 두 가지 차이점이 있습니다 &&
.
그들이 논리 AND로 사용하는 경우
&
그리고 &&
논리적 일 수있다 AND
, 할 때 &
또는 &&
좌우 표현이 모두 사실 결과, 전체 연산 결과가 사실이 될 수 있습니다.
때 &
와 &&
논리적으로 AND
, 차이가있다 :
&&
logical로 사용할 때 AND
왼쪽 표현식 결과가 false이면 오른쪽 표현식이 실행되지 않습니다.
예를 들어 보자.
String str = null;
if(str!=null && !str.equals("")){ // the right expression will not execute
}
사용하는 경우 &
:
String str = null;
if(str!=null & !str.equals("")){ // the right expression will execute, and throw the NullPointerException
}
다른 예 :
int x = 0;
int y = 2;
if(x==0 & ++y>2){
System.out.print(“y=”+y); // print is: y=3
}
int x = 0;
int y = 2;
if(x==0 && ++y>2){
System.out.print(“y=”+y); // print is: y=2
}
비트 연산자로 사용할 수 있습니다
&
비트 AND
연산자 로 사용할 수 있습니다 &&
.
비트 AND “&”연산자는 피연산자의 두 비트가 모두 1 인 경우에만 1을 생성합니다. 그러나 두 비트가 모두 0이거나 비트가 모두 다르면이 연산자는 0을 생성합니다. AND “&”연산자는 두 비트 중 하나가 1이면 1을 반환하고 비트 중 하나가 0이면 0을 반환합니다.
위키 페이지에서 :
http://www.roseindia.net/java/master-java/java-bitwise-and.shtml