어떤 세트가 단락되고 복잡한 조건식이 단락된다는 것은 정확히 무엇을 의미합니까?
public static void main(String[] args) {
int x, y, z;
x = 10;
y = 20;
z = 30;
// T T
// T F
// F T
// F F
//SET A
boolean a = (x < z) && (x == x);
boolean b = (x < z) && (x == z);
boolean c = (x == z) && (x < z);
boolean d = (x == z) && (x > z);
//SET B
boolean aa = (x < z) & (x == x);
boolean bb = (x < z) & (x == z);
boolean cc = (x == z) & (x < z);
boolean dd = (x == z) & (x > z);
}
답변
&&
와 ||
이 필요하지 않은 의미 사업자 “단락”, 그들은 오른쪽을 평가하지 않습니다.
&
및 |
논리 연산자로 사용하는 경우 사업자는, 항상 양쪽을 평가합니다.
각 오퍼레이터에 대해 단 하나의 단락 사례가 있으며 다음과 같습니다.
false && ...
-결과는false
거기의 값에 관계없이 결과가 될 수 있기 때문에 오른쪽이 무엇인지 알 필요가 없습니다true || ...
-결과는true
거기의 값에 관계없이 결과가 될 수 있기 때문에 오른쪽이 무엇인지 알 필요가 없습니다
간단한 예에서 동작을 비교해 보겠습니다.
public boolean longerThan(String input, int length) {
return input != null && input.length() > length;
}
public boolean longerThan(String input, int length) {
return input != null & input.length() > length;
}
두 번째 버전은 비 단락 연산자를 사용 &
하고 NullPointerException
if input
is 를 throw null
하지만 첫 번째 버전은 false
예외없이 반환 됩니다.
답변
SET A는 단락 부울 연산자를 사용합니다.
부울 연산자의 맥락에서 ‘단락’이 의미하는 것은 일련의 부울 b1, b2, …, bn에 대해 단락 회로 버전은 이러한 부울 중 첫 번째가 참이되는 즉시 평가를 중단한다는 것입니다 (|| ) 또는 false (&&).
예를 들면 :
// 2 == 2 will never get evaluated because it is already clear from evaluating
// 1 != 1 that the result will be false.
(1 != 1) && (2 == 2)
// 2 != 2 will never get evaluated because it is already clear from evaluating
// 1 == 1 that the result will be true.
(1 == 1) || (2 != 2)
답변
단락은 첫 번째 운영자가 최종 결과를 결정하는 경우 두 번째 운영자를 확인하지 않음을 의미합니다.
예 : True || 그릇된
||의 경우, 우리가 필요로 하는 것은 참 이되는면 중 하나입니다 . 따라서 왼쪽이 참이면 오른쪽을 확인하는 데 아무런 의미가 없으므로 전혀 확인되지 않습니다.
마찬가지로 False && True
&&의 경우 양쪽 모두 True가되어야합니다. 따라서 왼쪽이 False이면 오른쪽을 검사 할 필요가 없으며 답은 False가되어야합니다. 따라서 그것은 전혀 확인되지 않을 것입니다.
답변
boolean a = (x < z) && (x == x);
이런 종류의 경우 의미 단락 것이다 (x < z)
평가되지 않습니다 다음 후자 FALSE로는, a
그렇지 않으면 false 것 &&
또한 평가합니다 (x == x)
.
&
비트 연산자이지만 단락되지 않는 부울 AND 연산자이기도합니다.
다음과 같이 테스트 할 수 있습니다 (각 사례에서 메서드가 호출되는 횟수 참조).
public static boolean getFalse() {
System.out.println("Method");
return false;
}
public static void main(String[] args) {
if(getFalse() && getFalse()) { }
System.out.println("=============================");
if(getFalse() & getFalse()) { }
}
답변
간단히 말해서, 단락 이란 답이 더 이상 바뀔 수 없다는 것을 알게되면 평가를 중단하는 것을 의미합니다. 예를 들어 논리 체인을 평가하고 해당 체인의 중간에서 AND
a를 발견하면 FALSE
체인의 나머지 표현식 값에 관계없이 결과가 거짓임을 알 수 있습니다. 일련의 OR
s도 마찬가지입니다 . 일단을 발견하면 TRUE
바로 답을 알 수 있으므로 나머지 표현식 평가를 건너 뛸 수 있습니다.
&&
대신 &
및 ||
대신을 사용하여 단락을 원한다는 것을 Java에 표시합니다 |
. 게시물의 첫 번째 세트는 단락입니다.
이것은 CPU 사이클을 절약하려는 시도 이상입니다.
if (mystring != null && mystring.indexOf('+') > 0) {
...
}
단락은 올바른 작동과 충돌 (mystring이 null 인 경우)의 차이를 의미합니다.
답변
Java는 대부분의 다른 컴퓨터 언어에서 찾을 수없는 두 가지 흥미로운 부울 연산자를 제공합니다. AND 및 OR의 이러한 보조 버전을 단락 논리 연산자라고 합니다. 앞의 표에서 볼 수 있듯이 OR 연산자는 B가 무엇이든 A가 참이면 참이됩니다.
마찬가지로 AND 연산자는 B가 무엇이든간에 A가 거짓이면 거짓이됩니다. 이러한 연산자 의 and 형식 대신 ||
및 &&
형식 을 사용하는 경우 Java는 오른쪽 피연산자를 단독으로 평가하지 않습니다. 이것은 오른쪽 피연산자가 제대로 작동하기 위해 왼쪽 피연산자가 true 또는 false에 의존 할 때 매우 유용합니다.|
&
예를 들어, 다음 코드 조각은 단락 연산이 평가 전에 유효한지 확인하기 위해 단락 논리 평가를 활용하는 방법을 보여줍니다.
if ( denom != 0 && num / denom >10)
단락 형식의 AND ( &&
)가 사용되기 때문에 런타임 예외가 0으로 나눌 위험이 없습니다. 이 코드 줄이 단일 &
버전의 AND를 사용하여 작성 되었다면 양쪽을 모두 평가해야하므로 denom
0 일 때 런타임 예외 가 발생합니다.
부울 논리와 관련된 경우 AND 및 OR의 단락 형식을 사용하여 단일 문자 버전은 비트 연산 전용으로 남겨 두는 것이 표준 관행입니다. 그러나이 규칙에는 예외가 있습니다. 예를 들어, 다음 문을 고려하십시오.
if ( c==1 & e++ < 100 ) d = 100;
여기서 단일 &
을 사용 하면 1과 같은지 e
여부에 증분 연산이 적용됩니다 c
.
답변
논리 OR :-피연산자 중 하나 이상이 true로 평가되면 true를 반환합니다. OR 연산자를 적용하기 전에 두 피연산자가 모두 평가됩니다.
Short Circuit OR :-왼쪽 피연산자가 true를 반환하면 오른쪽 피연산자를 평가하지 않고 true를 반환합니다.