||
두 가지 부울 사이에 논리 OR을 사용하는 이유가 비트 OR이 아닌지 궁금 |
합니다.
내 말은, 다음을보십시오 :
if(true | true) // pass
if(true | false) // pass
if(false | true) // pass
if(false | false) // no pass
if(true || true) // pass
if(true || false) // pass
if(false || true) // pass
if(false || false) // no pass
|
대신에 사용할 수 있습니까 ||
? 와 같은 것은 &
하고 &&
.
답변
이 연산자 의 and 형식 대신 ||
and &&
형식 을 사용하면 Java는 오른쪽 피연산자 만 평가하지 않아도됩니다.|
&
대부분 의 경우 평가를 단락하려는 경우 문제가됩니다 .
단락의 이점을 설명하는 좋은 방법은 다음 예를 고려하는 것입니다.
Boolean b = true;
if(b || foo.timeConsumingCall())
{
//we entered without calling timeConsumingCall()
}
제레미와 피터가 언급했듯이 단락에 대한 또 다른 이점은 null 참조 검사입니다.
if(string != null && string.isEmpty())
{
//we check for string being null before calling isEmpty()
}
답변
|
부울 식에서 단락 평가를 수행하지 않습니다 . ||
첫 번째 피연산자가 참인지 평가를 중단하지만 |
그렇지 않습니다.
또한 |
byte / short / int / long 값에 대해 비트 단위 OR 연산을 수행하는 데 사용할 수 있습니다. ||
할 수 없습니다.
답변
따라서 예를 들어 다른 답변을 작성하려면 다음 방어 검사에서 단락이 중요합니다.
if (foo == null || foo.isClosed()) {
return;
}
if (bar != null && bar.isBlue()) {
foo.doSomething();
}
사용 |
및 &
A의 초래할 수 대신 NullPointerException
여기에 던져지지.
답변
논리적 ||
이며 &&
필요한 경우에만 오른쪽을 확인하십시오. |
및 &
측면 매번 모두 확인합니다.
예를 들면 다음과 같습니다.
int i = 12;
if (i == 10 & i < 9) // It will check if i == 10 and if i < 9
...
다시 작성하십시오.
int i = 12;
if (i == 10 && i < 9) // It will check if i == 10 and stop checking afterward because i != 10
...
다른 예시:
int i = 12;
if (i == 12 | i > 10) // It will check if i == 12 and it will check if i > 10
...
다시 작성하십시오.
int i = 12;
if (i == 12 || i > 10) // It will check if i == 12, it does, so it stops checking and executes what is in the if statement
...
답변
또한 일반적인 함정에 주목하십시오. 게으른 연산자가 게으른 연산자보다 우선합니다.
boolean a, b, c;
a || b && c; //resolves to a || (b && c)
a | b && c; //resolves to (a | b) && c
혼합 할 때주의하십시오.
답변
단락 이외에도 0 또는 1 이외의 값에 대해 비트 단위 논리 연산을 수행하면 조건부 논리와 매우 다른 의미가 있다는 점을 명심해야합니다. 그것은 일반적으로에 대한 동일하지만 |
과 ||
에, &
그리고 &&
당신은 매우 다른 결과를 얻을 수 있습니다 (예 : 2 & 4
0 / 거짓 동안은 2 && 4
1 / 사실이다).
함수에서 얻는 것이 실제로 오류 코드이고 0이 아닌지를 테스트하는 경우 이것은 매우 중요합니다.
Java에서 부울 또는 0 등과 비교하기 위해 명시 적으로 타입 캐스트 해야하는 문제는 아니지만 비슷한 구문 (C / C ++ 등)을 가진 다른 언어에서는 상당히 혼란 스러울 수 있습니다.
또한 & 및 | 부울 테스트와 동등한 모든 것이 아니라 정수 유형 값에만 적용 할 수 있습니다. 다시 말하지만, Java 이외의 언어에서는 암시 적 != 0
비교 (포인터, 플로트, 객체 operator bool()
등)를 사용하여 부울로 사용할 수있는 몇 가지 사항이 있으며 비트 연산자는 이러한 맥락에서 거의 무의미합니다.
답변
당신이 사용하는 것이 유일한 시간 |
또는 &
대신에 ||
또는 &&
당신은 매우 간단한 불리언 표현식과 짧은 절단 (즉, 지점)의 비용이있을 때이다가 나중에 표현식을 평가하지 선방 시간 당신보다 더 크다.
그러나 이것은 가장 낮은 수준의 코드를 제외하고는 거의 중요하지 않은 미세 최적화입니다.
