[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;
}

두 번째 버전은 비 단락 연산자를 사용 &하고 NullPointerExceptionif inputis 를 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()) { }
}


답변

간단히 말해서, 단락 이란 답이 더 이상 바뀔 수 없다는 것을 알게되면 평가를 중단하는 것을 의미합니다. 예를 들어 논리 체인을 평가하고 해당 체인의 중간에서 ANDa를 발견하면 FALSE체인의 나머지 표현식 값에 관계없이 결과가 거짓임을 알 수 있습니다. 일련의 ORs도 마찬가지입니다 . 일단을 발견하면 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를 사용하여 작성 되었다면 양쪽을 모두 평가해야하므로 denom0 일 때 런타임 예외 가 발생합니다.

부울 논리와 관련된 경우 AND 및 OR의 단락 형식을 사용하여 단일 문자 버전은 비트 연산 전용으로 남겨 두는 것이 표준 관행입니다. 그러나이 규칙에는 예외가 있습니다. 예를 들어, 다음 문을 고려하십시오.

 if ( c==1 & e++ < 100 ) d = 100;

여기서 단일 &을 사용 하면 1과 같은지 e여부에 증분 연산이 적용됩니다 c.


답변

논리 OR :-피연산자 중 하나 이상이 true로 평가되면 true를 반환합니다. OR 연산자를 적용하기 전에 두 피연산자가 모두 평가됩니다.

Short Circuit OR :-왼쪽 피연산자가 true를 반환하면 오른쪽 피연산자를 평가하지 않고 true를 반환합니다.