Java 논리 연산자 단락
어떤 세트가 단락입니까?복잡한 조건부 식이 단락이라는 것은 정확히 무엇을 의미합니까?
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;
}
연산자 「」를 합니다.&
던질 거예요.고 a a a a a a a a a a a a a를 던질 거예요.NullPointerException
input
null
, 첫 false
예외 없이
SET A는 단락 부울 연산자를 사용합니다.
부울 연산자의 맥락에서 '단락'이란 일련의 부울런 b1, b2, ..., bn에 대해 이들 부울런 중 첫 번째가 참(|) 또는 거짓(&)인 즉시 단락 버전이 평가를 중단한다는 것을 의미합니다.
예를 들어 다음과 같습니다.
// 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가 되는 한쪽 면만 있으면 됩니다.따라서 왼쪽이 참이면 오른쪽을 확인할 필요가 없기 때문에 전혀 체크되지 않습니다.
마찬가지로 False & True
&&의 경우 양쪽이 True여야 합니다.따라서 왼쪽이 False일 경우 오른쪽을 확인할 필요가 없습니다. 정답은 False여야 합니다.따라서 그것은 전혀 체크되지 않습니다.
boolean a = (x < z) && (x == x);
은 단락이 즉, 이 타입은 단락이 됩니다.(x < z)
되지 않습니다.false는 false로 평가되지 않습니다.a
거짓이 된다.&&
(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
하면, 「」가 됩니다.FALSE
그 사슬의 중간에는 결과가 거짓이라는 것을 알 수 있습니다. 사슬의 나머지 표현들의 값이 어떻게 되든 상관없습니다.으로도 마찬가지다OR
: 를 하면: " " "TRUE
정답을 바로 알 수 있기 때문에 나머지 표현에 대한 평가는 생략할 수 있습니다.
「Java」를 하고, 「Java」의 단락을 것을 에 .&&
&
★★★★★★★★★★★★★★★★★」||
|
당신의 투고에 있는 첫 번째 세트는 단락입니다.
이는 몇 개의 CPU 사이클을 절약하기 위한 시도 이상의 것입니다.이러한 표현은 다음과 같습니다.
if (mystring != null && mystring.indexOf('+') > 0) {
...
}
short-interiting은 올바른 동작과 크래시의 차이를 의미합니다(mystring이 늘인 경우).
Java는 다른 대부분의 컴퓨터 언어에서 볼 수 없는 두 개의 흥미로운 부울 연산자를 제공합니다.이러한 AND 및 OR의 세컨더리 버전은 단락 논리 연산자로 알려져 있습니다.위의 표에서 알 수 있듯이 OR 연산자는 B가 무엇이든 A가 참이면 참이 됩니다.
AND AND AND False False False False False.「 」를하고 있는 는,||
★★★★★★★★★★★★★★★★★」&&
이 을 참조해당 폼은|
★★★★★★★★★★★★★★★★★」&
Java는 이러한 연산자의 형식을 사용하여 우측 연산자만을 평가하지 않습니다.이는 오른쪽 피연산자가 올바르게 기능하기 위해 왼쪽 피연산자가 참인지 거짓인지에 따라 달라지는 경우에 매우 유용합니다.
예를 들어, 다음 코드 fragment는 단락 논리 평가를 이용하여 분할 동작이 유효한지 여부를 평가 전에 확인하는 방법을 보여 줍니다.
if ( denom != 0 && num / denom >10)
AND)의&&
를 사용하면 런타임 예외를 0으로 나눌 위험이 없습니다. &
AND가 실행 시 합니다.denom
0이 .
부울 로직의 경우 AND 및 OR의 단락 형식을 사용하는 것이 표준이며, 단일 문자 버전은 비트 연산 전용입니다.단, 이 규칙에는 예외가 있습니다.예를 들어, 다음 문장을 생각해 보겠습니다.
if ( c==1 & e++ < 100 ) d = 100;
의 「일부」를 하고 있습니다.&
는, 인크리먼트 이 「」에 합니다.e
★★★★★★★★★★★★★★★의 유무c
1의
논리 OR :- 피연산자 중 하나 이상이 true로 평가되면 true를 반환합니다.OR 연산자를 적용하기 전에 두 오퍼랜드가 모두 평가됩니다.
Short Circuit OR :- 좌측 피연산자가 true를 반환하면 우측 피연산자를 평가하지 않고 true를 반환합니다.
between there there there 、 there there 、 there there 、 there there 、 there there 、 there there there 。&
★★★★★★★★★★★★★★★★★」&&
다름이 없다.|
★★★★★★★★★★★★★★★★★」||
&&
는 부울 오퍼랜드에만 적용되는 논리 연산자입니다.&
는 정수형 및 부란에 적용되는 비트 연산자입니다.
할 수 은 경우에 첫 입니다.특정 상황에서는 (의 첫 번째 피연산자와 같이)&&
존존 false
""의 첫 "입니다||
존존 true
나머지 표현식을 평가할 필요는 없습니다. 하면 '확인하다'를 할 때 유용합니다.null
파일 또는 메서드에 액세스하여 잠재적인 0을 확인한 후 필드로 나눕니다.복소 표현식의 경우 식의 각 부분을 동일한 방법으로 재귀적으로 평가합니다.예를 들어 다음과 같습니다.
(7 == 8) | | (1 == 3) & (4 == 4)
강조된 부분만 평가됩니다.「 」를 하려면 , 「 」를 참조해 주세요.||
7 == 8
true
그러면 오른쪽은 완전히 건너뜁니다.은 하다, 하다, 하다, 요.1 == 3
false
4 == 4
가 없고, 은 '어느 정도'로 됩니다.false
이 쪽쪽면true
예 , ) 。7 == 7
7 == 8
오른쪽 ||
은 '하다, 하다, 하다'가 될 거예요.true
개의치 않고.
비트 단위 연산에서는 실제로는 비트를 조합하고 있기 때문에 모든 오퍼랜드를 평가할 필요가 있습니다.부언은 Java에서 실질적으로 1비트 정수이며(내부 처리 방법에 관계없이), 특별한 경우 비트 연산자에 대한 단락을 수행할 수 있는 것은 우연의 일치에 불과합니다. 정수를 수 &
★★★★★★★★★★★★★★★★★」|
동작이란, 어느 피연산자에서도, 몇개의 비트가 온으로 되어 있는 경우와 오프인 경우가 있습니다.1 & 2
두 오퍼랜드를 평가하지 않으면 알 수 없습니다.
if(demon!=0&& num/demon>10)
AND(&)의 단락 형식이 사용되므로 demon이 0일 때 런타임 예외를 발생시킬 위험이 없습니다.
Herbert Schildt 참조 Java 2 제5판
docs.oracle로부터의 문서
논리식은 왼쪽에서 오른쪽으로 평가될 때 다음 규칙을 사용하여 가능한 "단락" 평가를 테스트합니다.
false & anything은 false로 단락 평가됩니다.
true | anything은 true로 단락 평가됩니다.
논리 규칙은 이러한 평가가 항상 옳음을 보증합니다.위의 식 중 어떤 부분도 평가되지 않으므로, 이로 인한 부작용은 발생하지 않습니다.
https://docs.oracle.com/cd/E57185_01/HIRUG/ch31s05s01.html
언급URL : https://stackoverflow.com/questions/8759868/java-logical-operator-short-circuiting
'source' 카테고리의 다른 글
통신 패킷을 읽는 동안 MYSQL 오류가 발생했습니다. (0) | 2022.09.17 |
---|---|
PHP 및 MySQL에서 경고 및 오류 끄기 (0) | 2022.09.16 |
도커: Windows 호스트에서 MariaDB/MySQL 부팅 실패 (0) | 2022.09.16 |
Vue with Vuex: 스토어 내에서 컴포넌트를 주입/이젝트할 수 있습니까? (0) | 2022.09.16 |
Python의 while 스테이트먼트에서의 Else 절 (0) | 2022.09.16 |