[java] Java에서 &와 &&의 차이점은 무엇입니까?

나는 항상 &&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