[java] 부울 연산자의 차이점 : & 대 && 및 | vs ||

나는 규칙을 알고 &&하고 ||있지만 무엇 &|? 예를 들어 설명해주세요.



답변

비트 AND 및 비트 OR 연산자입니다.

int a = 6; // 110
int b = 4; // 100

// Bitwise AND    

int c = a & b;
//   110
// & 100
// -----
//   100

// Bitwise OR

int d = a | b;
//   110
// | 100
// -----
//   110

System.out.println(c); // 4
System.out.println(d); // 6

입력을 기반으로 한 연산자의 다양한 동작과 관련하여 Java 언어 사양 ( 15.22.1 , 15.22.2 ) 에서 적절한 섹션을 지적한 Carlos에게 감사드립니다 .

실제로 두 입력이 모두 부울이면 연산자는 부울 논리 연산자로 간주 되며 다음이 안전하지만 단락되지 않는다는 점을 제외하면 &&조건부 및 ( ) 및 조건부 또는 ( ||) 연산자 와 유사하게 작동 합니다. :

if((a != null) && (a.something == 3)){
}

이것은 아니다:

if((a != null) & (a.something == 3)){
}

“단락”은 작업자가 모든 조건을 검사 할 필요는 없음을 의미합니다. 위의 예에서, &&경우에만 두 번째 조건을 검사 할 a수 없습니다 null(그렇지 않으면 전체 문이 false를 반환합니다, 어쨌든 조건에 따라 조사 할 논쟁 것)의 문 있도록 a.something예외를 발생하지 않을 것이다, 또는 “안전한 것으로 간주됩니다 . “

&작업자는 항상 상기의 예에서, 상기 구문의 모든 조건을 검사 a.something할 때 평가 될 수 a사실 A는 null예외를 제기 값.


답변

두 연산자의 논리적 의미에 대해 이야기하고 있다고 생각합니다. 여기에 테이블 이력서가 있습니다.

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

단락 평가 , 최소 평가 또는 McCarthy 평가 (John McCarthy 이후)는 일부 프로그래밍 언어에서 두 번째 인수가 실행되거나 첫 번째 인수가 값을 결정하는 데 충분하지 않은 경우에만 평가되는 일부 부울 연산자의 의미입니다. 표현식 : AND 함수의 첫 번째 인수가 거짓으로 평가되면 전체 값은 거짓이어야합니다. OR 함수의 첫 번째 인수가 true로 평가되면 전체 값이 true 여야합니다.

안전하지 않음 은 연산자가 항상 절의 모든 조건을 검사 함을 의미하므로 위의 예에서 1 / x는 x가 실제로 0 값일 때 평가되어 예외가 발생할 수 있습니다.


답변

여기에 많은 답변이 있다는 것을 알고 있지만 모두 약간 혼란스러워 보입니다. 그래서 Java oracle 학습 가이드에서 몇 가지 조사를 한 후 && 또는 &를 사용할 때 세 가지 시나리오를 생각해 냈습니다. 세 가지 시나리오는 논리 AND , 비트 AND부울 AND 입니다.

논리적 AND :
논리 AND (일명 조건부 AND)는 && 연산자를 사용합니다 . 단락 된 의미입니다. 왼쪽 피연산자가 거짓이면 오른쪽 피연산자가 평가되지 않습니다.
예:

int x = 0;
if (false && (1 == ++x) {
    System.out.println("Inside of if");
}
System.out.println(x); // "0"

위의 예에서 x의 콘솔에 인쇄 된 값은 if 문의 첫 번째 피연산자가 false이므로 java가 계산할 필요가 없으므로 (1 == ++ x) x가 계산되지 않기 때문에 0이됩니다.

비트 AND :
비트 AND는 & 연산자를 사용합니다 . 값에 대해 비트 연산을 수행하는 데 사용됩니다. 이진수에 대한 연산을 살펴보면 무슨 일이 일어나는지 보는 것이 훨씬 쉽습니다. 예 :

int a = 5;     //                    5 in binary is 0101
int b = 12;    //                   12 in binary is 1100
int c = a & b; // bitwise & preformed on a and b is 0100 which is 4

예에서 볼 수 있듯이 숫자 5와 12의 이진 표현이 정렬되면 비트 AND preformed는 두 숫자의 동일한 숫자가 1 인 이진 숫자 만 생성합니다. 따라서 0101 & 1100 == 0100. 십진수로 5 & 12 == 4입니다.

부울 AND :
이제 부울 AND 연산자가 비트 AND 및 논리 AND 모두에 대해 유사하고 다르게 작동합니다. 나는 두 개의 부울 값 (또는 비트) 사이에 비트 AND를 미리 형성하는 것으로 생각하고 싶으므로 & 연산자를 사용합니다 . 부울 값은 논리식의 결과 일 수도 있습니다.

논리 AND와 매우 유사하게 true 또는 false 값을 반환하지만 논리 AND와 달리 단락되지 않습니다. 그 이유는 비트 AND를 수행하려면 왼쪽 및 오른쪽 피연산자의 값을 모두 알아야하기 때문입니다. 예를 들면 다음과 같습니다.

int x = 0;
if (false & (1 == ++x) {
    System.out.println("Inside of if");
}
System.out.println(x); //"1"

이제 if 문이 실행되면 왼쪽 피연산자가 false 인 경우에도 (1 == ++ x) 표현식이 실행됩니다. 따라서 x에 대해 인쇄 된 값은 증가했기 때문에 1이됩니다.

이것은 논리 OR (||), 비트 OR (|) 및 부울 OR (|)에도 적용됩니다. 이것이 약간의 혼란을 없애기를 바랍니다.


답변

연산자 && 및 || 단락입니다. 즉, 왼손 표현식의 값이 결과를 결정하기에 충분하면 오른손 표현식을 평가하지 않습니다.


답변

& 및 | &&와 같은 결과를 제공하고 || 연산자. 차이점은 항상 && 및 ||로 표현의 양쪽을 평가한다는 것입니다. 첫 번째 조건이 결과를 결정하기에 충분한 지 평가를 중지하십시오.


답변

Java에서 단일 연산자 &, |, ^,! 피연산자에 따라 다릅니다. 두 피연산자가 모두 int이면 비트 연산이 수행됩니다. 둘 다 부울이면 “논리”연산이 수행됩니다.

두 피연산자가 일치하지 않으면 컴파일 시간 오류가 발생합니다.

이중 연산자 &&, || 단일 피연산자와 유사하게 작동하지만 두 피연산자는 모두 조건식이어야합니다. 예를 들면 다음과 같습니다.

if ((a <0) && (b <0)) {…} 또는 유사하게 if ((a <0) || (b <0)) {…}

출처 : 자바 프로그래밍 언어 4 판


답변

&|통합 유형에 대한 비트 연산자 (예입니다 int) : http://download.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

&&||(다른 답변은 이미 말했듯이, 및 단락 회로) 논리 값에 만 작동합니다.