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


167

나는 항상 &&Java true&연산자가 부울 피연산자가 모두인지 여부를 확인하는 데 사용되고 연산자는 두 정수 유형에서 비트 단위 연산을 수행 하는 데 사용 된다고 생각했습니다 .

최근에 나는 &연산자가 두 부울 피연산자가 모두인지 여부를 확인하는 데 사용될 수 있다는 것을 알게 되었으며 true, 유일한 차이점은 LHS 피연산자가 false 인 경우에도 RHS 피연산자를 검사한다는 것입니다.

&Java 의 연산자가 내부적으로 과부하 되었습니까? 아니면 이것 뒤에 다른 개념이 있습니까?


3
가능한 중복 우리
블레이크 Yarbrough

가능한 경우 Double은 바로 가기를 수행합니다.
니콜라스 해밀턴

답변:


278

& <-두 피연산자를 모두 확인합니다.
&& <-결과가 거짓이므로 첫 번째 피연산자가 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와 수행 ||.


7
하나를 작성하는 이유는 무엇입니까? if 문에서? && 및 ||보다 빠르지 않습니다. 이미 답을 얻을 수 있다면 왜 두 번째 상태를 확인하고 싶습니까? 현실적인 예를 제공 할 수 있습니까?
Michu93

14
@ Michu93 : 두 번째 조건이 항상 필요한 부작용이있는 함수 호출 인 경우를 예로들 수 있습니다. 부작용은 대개 피해야하므로, 필요한 경우는 드물지만 현재로서는 현실적인 예를 생각할 수 없습니다.
Heinzi

54

두 피연산자를 모두 평가하여 지연 평가자가 아닌 비트 연산자의 주요 특성은 다음 예제와 같이 피연산자의 각 바이트를 비교한다고 생각합니다.

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

2
문제는 비트 연산이 아닌 논리 부울 연산에 관한 것입니다.
Lorne의 후작

21
@EJP 제목 만 읽는 나 같은 Google 직원을 도와줍니다.
Ad Infinitum

29
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

편집 해 주신 Andreas에게 감사드립니다. 다른 질문도 도움이 될 것입니다. stackoverflow.com/questions/4014535/vs-and-vs
Torres

11

그것은 인수의 유형에 달려 있습니다 ...

정수 인수의 경우 단일 앰퍼샌드 ( "&")는 "비트 AND"연산자입니다. 이중 앰퍼샌드 ( "&&")는 두 개의 부울 인수 외에는 정의되지 않습니다.

부울 인수의 경우 단일 앰퍼샌드는 (무조건) "논리 AND"연산자를 구성하고 이중 앰퍼샌드 ( "&&")는 "조건부 논리 AND"연산자입니다. 즉, 단일 앰퍼샌드는 항상 두 인수를 모두 평가하지만 이중 앰퍼샌드는 첫 번째 인수가 참이면 두 번째 인수 만 평가합니다.

다른 모든 인수 유형 및 조합의 경우 컴파일 타임 오류가 발생합니다.


9

&&는 단락 연산자이고 &는 AND 연산자입니다.

이 시도.

    String s = null;
    boolean b = false & s.isEmpty(); // NullPointerException
    boolean sb = false && s.isEmpty(); // sb is false

7

JLS (15.22.2)에 지정된 것과 같습니다.

&, ^ 또는 | 연산자는 부울 또는 부울 유형이고 비트 연산자 표현식의 유형은 부울입니다. 모든 경우에, 피연산자는 필요에 따라 언 박스 변환 (§5.1.8)을 받아야합니다.

&의 경우, 두 피연산자 값이 모두 참이면 결과 값은 참입니다. 그렇지 않으면 결과는 거짓입니다.

^의 경우, 피연산자 값이 다른 경우 결과 값은 true입니다. 그렇지 않으면 결과는 거짓입니다.

|의 경우, 두 피연산자 값이 모두 false 인 경우 결과 값은 false입니다. 그렇지 않으면 결과는 사실입니다.

은 "트릭은"즉 &입니다 정수 비트 단위 연산자 뿐만 아니라 부울 논리 연산자 . 따라서 이것을 연산자 오버로드 의 예로 보는 것이 합리적입니다.


7

내 대답이 더 이해하기 쉽다고 생각합니다.

&와 사이에는 두 가지 차이점이 있습니다 &&.

그들이 논리 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


4

'&&':-논리 AND 연산자는 인수의 논리적 관계에 따라 부울 값 true 또는 false를 생성합니다.

예를 들면 다음과 같습니다.-Condition1 && Condition2

Condition1이 false이면 (Condition1 && Condition2)는 항상 false가되므로이 논리 연산자는 다른 조건을 평가하지 않기 때문에 단락 연산자라고도합니다. Condition1이 false 인 경우 Condtiton2를 평가할 필요가 없습니다.

Condition1이 true이면 Condition2가 평가되고, true이면 전체 결과가 true이고 그렇지 않으면 false입니다.

'&':-는 비트 단위 AND 연산자입니다. 입력 비트가 모두 1 인 경우 출력에서 ​​1을 생성합니다. 그렇지 않으면 0을 생성합니다.

예를 들면 다음과 같습니다.

int a = 12; // 12의 이진 표현은 1100입니다

int b = 6; // 6의 이진 표현은 0110

int c = (a & b); // (12 & 6)의 이진 표현은 0100입니다

c의 값은 4입니다.

참고로 http://techno-terminal.blogspot.in/2015/11/difference-between-operator-and-operator.html 을 참조하십시오.


3

&&||단락 회로 사업자라고합니다. 이들이 사용될 때 ||-for 첫 번째 피연산자가로 평가 true되면 나머지 피연산자는 평가되지 않습니다. 대한 &&- 첫 번째 피연산자 평가하여이하는 경우에 false, 그 나머지는 전혀 평가되지 않습니다.

따라서이 if (a || (++x > 0))예제에서 변수 x는 a이면 증가하지 않습니다 true.


3

부울을 사용하면 둘 사이에 출력 차이가 없습니다. && 및 & 또는 ||를 바꿀 수 있습니다. 와 | 그리고 그것은 당신의 표현의 결과를 결코 바꾸지 않을 것입니다.

차이점은 정보가 처리되는 장면 뒤에 있습니다. a = 0 및 b = 1에 대해 "(a! = 0) & (b! = 0)"식을 지정하면 다음이 발생합니다.

left side: a != 0 --> false
right side: b 1= 0 --> true
left side and right side are both true? --> false
expression returns false

(a != 0) && ( b != 0)a = 0 및 b = 1 일 때 표현식을 작성할 때 다음이 발생합니다.

a != 0 -->false
expression returns false

부울식이 많거나 복잡한 인수를 수행 할 때 더 적은 단계, 더 적은 처리, 더 나은 코딩.


2
피연산자에 부작용이있는 경우 표현식의 전체 결과가 변경됩니다.
Lorne의 후작

3

&&와 || 단락이 발생하기 때문에 두 형태를 혼합 할 때 작업자 우선 순위를 고려하십시오. result1과 result2에 다른 값이 포함되어있는 모든 사람에게 즉시 명백하지는 않을 것이라고 생각합니다.

boolean a = true;
boolean b = false;
boolean c = false;

boolean result1 = a || b && c; //is true;  evaluated as a || (b && c)
boolean result2 = a  | b && c; //is false; evaluated as (a | b) && c

0

&는 비트 연산자이며, 두 조건을 모두 평가해야하기 때문에 두 조건을 모두 확인하는 데 사용됩니다. 그러나 && 논리 연산자는 첫 번째 조건이 적용되면 두 번째 조건으로 이동합니다.


0

모든 답변은 great이며 no더 많은 답변 인 것처럼 보이지만 연산자 is needed 에 대해 뭔가 지적하고 싶습니다.&&dependent condition

연산자 &&를 사용하는 표현식에서 조건이라고 부릅니다 dependent condition. 종속 조건의 평가가 의미를 갖기 위해서는 다른 조건이 참이어야 할 수도 있습니다.

이 경우 종속 조건은 && 연산자 다음에 위치하여 오류를 방지해야합니다.

표현을 고려하십시오 (i != 0) && (10 / i == 2). 종속 조건 (10 / i == 2)은 작업자가 0으로 나눌 가능성을 방지 해야 appear after합니다 &&.

다른 예시 (myObject != null) && (myObject.getValue() == somevaluse)

그리고 또 다른 한가지 : &&||호출 단락 회로 평가 2 번째의 인수가 실행되거나 평가되기 때문에 인수가 않습니다 에only iffirstnot sufficedeterminevalueexpression

참조 : Java ™ 프로그래밍 방법 (초기 객체), 10 판

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.