programing

IF 문의 & (AND) 및 | (OR)

shortcode 2022. 9. 18. 20:29
반응형

IF 문의 & (AND) 및 | (OR)

다음 코드가 있습니다.

if(!partialHits.get(req_nr).containsKey(z) || partialHits.get(req_nr).get(z) < tmpmap.get(z)){  
    partialHits.get(z).put(z, tmpmap.get(z));  
}

서 ''는partialHits 입니다 HashMap 」라고 합니다.
첫 번째 진술이 사실이라면 어떻게 될까요?Java는 여전히 두 번째 스테이트먼트를 확인할 수 있습니까?첫 번째 스테이트먼트가 참이 되기 위해서는 해시맵에 지정된 키가 포함되어 있지 않기 때문에 두 번째 스테이트먼트가 체크되면 다음 스테이트먼트를 얻을 수 있습니다.NullPointerException.
'이렇게 하다'가 '이렇게 하다'는 거죠.

if(a && b)  
if(a || b)

할 수 있을까요?ba이며, 「」의 경우는 false입니다.a째째째 케이 ??? ??? ???

아니요, 평가되지 않습니다.그리고 이것은 매우 유용합니다.예를 들어 String이 null이 아니거나 비어 있지 않은지 테스트해야 할 경우 다음과 같이 쓸 수 있습니다.

if (str != null && !str.isEmpty()) {
  doSomethingWith(str.charAt(0));
}

아니면 반대로

if (str == null || str.isEmpty()) {
  complainAboutUnusableString();
} else {
  doSomethingWith(str.charAt(0));
}

Java에 '단락'이 없다면 많은 Null Pointer를 받을 수 있을 것입니다.위의 코드 행의 예외.

Java에는 &, &&, |, ||, ^의 5가지 부울 비교 연산자가 있습니다.

& & & 는 "and" 연산자, | 및 | "or" 연산자, ^ 는 "xor" 연산자

단일 파라미터는 파라미터의 값을 체크하기 전에 값에 관계없이 모든 파라미터를 체크합니다.와 그 이 파라미터가 왼쪽 파라미터와 그 값을 확인합니다.true )|| ) 。false )&& 않고 놔두세요, 두 번째 것은 그대로 두세요.★★★★★★★★★★★★★★★★★?간단한 예시로 다음 사항을 명확히 할 수 있습니다.

모든 예에 대해 지정:

 String aString = null;

그리고:

 if (aString != null & aString.equals("lala"))

평가가 완료되기 전에 두 매개 변수가 모두 확인되며 Null Pointer가 사용됩니다.두 번째 파라미터에 대해 예외가 느려집니다.

 if (aString != null && aString.equals("lala"))

번째 됩니다.false두안 요. 가 '그래서'이기 때문입니다.그 이유는 다음과 같습니다.false★★★★★★★★★★★★★★★★★★.

OR도 마찬가지입니다.

 if (aString == null | !aString.equals("lala"))

Null Pointer가 발생합니다.예외도 있습니다.

 if (aString == null || !aString.equals("lala"))

번째 됩니다.true두안 요. 가 '그래서'이기 때문입니다.그 이유는 다음과 같습니다.true★★★★★★★★★★★★★★★★★★.

XOR은 두 매개 변수에 따라 달라지기 때문에 최적화할 수 없습니다.

아니요, 체크되지 않습니다.이 동작은 단락 평가라고 불리며 Java를 포함한 많은 언어의 기능입니다.

여기에 있는 모든 답변은 훌륭하지만, 이러한 질문의 출처를 설명하기 위해 Java Language Specification(Java 언어 사양)을 참조하는 것이 좋습니다.

섹션 15:23, 조건부 연산자(&)는 다음과 같이 기술한다.

그&&연산자 및,(§15.22.2)만 한다면, 그것의 왼쪽 피연산자의 가치 사실은 오른쪽 피연산자를 평가한다. 런타임에[...], 왼쪽 피연산자 표정 첫번째[...]결과 값 conditional-and 식의 값과 오른쪽 피연산자 표현eva지 않다 거짓이다 평가된다.luated.왼쪽 피연산자 값이 참이면 오른쪽 식이 평가됩니다. [...] 결과 값이 조건식 및 식 값이 됩니다.따라서 &은 & on boolean 피연산자와 같은 결과를 계산합니다.이는 오른쪽 피연산자 식이 항상이 아닌 조건부로 평가된다는 점에서만 다릅니다.

마찬가지로 섹션 15:24의 Conditional-Or 연산자(||)에는 다음과 같이 기술되어 있습니다.

|| 연산자는 | (15.22.2)와 비슷하지만 왼쪽 연산자의 값이 false인 경우에만 오른쪽 연산자를 평가합니다.[...] 실행 시 왼쪽 연산자 식이 먼저 평가됩니다.[...] 결과 값이 true이면 조건부 연산자 식이 true이고 오른쪽 연산자 식이 평가되지 않습니다.왼쪽 피연산자 값이 false이면 오른쪽 식이 평가되고 [...] 결과 값이 조건식 또는 식 값이 됩니다.따라서 ||는 부울 또는 부울 오퍼랜드에서 |과 같은 결과를 계산합니다.이는 오른쪽 피연산자 식이 항상이 아닌 조건부로 평가된다는 점에서만 다릅니다.

약간 반복적이긴 하지만 정확히 어떻게 작동하는지 가장 확실하게 확인할 수 있는 방법이죠.마찬가지로 조건부 연산자(?:)는 적절한 'half'(값이 참일 경우 왼쪽 절반, 거짓일 경우 오른쪽 절반)만 평가하므로 다음과 같은 식을 사용할 수 있습니다.

int x = (y == null) ? 0 : y.getFoo();

Null Pointer를 사용하지 않음예외.

여기서 단락은 두 번째 조건이 평가되지 않음을 의미합니다.

A가 False일 경우 (A & B)가 단락됩니다.

A가 True일 경우 (A & B)가 단락되지 않습니다.

A가 True일 경우 (A || B ) 단락이 발생합니다.

A가 False일 경우 (A || B ) 단락이 발생하지 않습니다.

( 「」에서는 「」( 「」의 경우)or테스트)는 테스트되지 않습니다.테스트 결과는 항상 true이기 때문입니다.b 식의 값이 무엇이든 상관없습니다.

간단한 테스트를 실시합니다.

if (true || ((String) null).equals("foobar")) {
    ...
}

조금도 하지 않다NullPointerException!

그렇지 않을 것입니다. Java는 결과를 알게 되면 합선을 하고 평가를 중단합니다.

네, 부울식에 대한 단락 평가는 모든 C-like 패밀리에서 기본 동작입니다.

에서도 '자바'가 되고 있다는 입니다.& ★★★★★★★★★★★★★★★★★」|)로 지정됩니다.int유형: 기대 비트 연산) 식에 있는 모든 항을 평가하기 위해 사용할 수 있으며, 이는 부작용이 필요할 때도 유용합니다.

이것은 & & &, | 및 ||의 기본적인 차이에 기인합니다.

그런데 같은 작업을 여러 번 수행합니다.효율이 문제인지 아닌지 잘 모르겠다.중복되는 부분을 제거할 수 있습니다.

Z z2 = partialHits.get(req_nr).get(z); // assuming a value cannout be null.
Z z3 = tmpmap.get(z); // assuming z3 cannot be null.
if(z2 == null || z2 < z3){   
    partialHits.get(z).put(z, z3);   
} 

언급URL : https://stackoverflow.com/questions/1795808/and-and-or-in-if-statements

반응형