카테고리 보관물: 자바

자바

Java 복합 할당 연산자 && 를 적용합니까?

아래와 같은 코드를 가정해 볼께요

boolean a = false;

나는 아래 코드가  궁금합니다.

a &= b; 
a = a && b; //logical AND, a is false hence b is not evaluated.

또는 다른 한편으로는

a = a & b; //Bitwise AND. Both a and b are evaluated.


답변

Java 언어 사양에서 – 15.26.2 복합 할당 연산자 .

형태의 복합 대입 식을 E1 op= E2동등 E1 = (T)((E1) op (E2))여기서 T의 타입 E1즉 제외 E1한번만 평가된다.

그래서 a &= b; 동일합니다a = a & b; .

(일부 용도에서, 캐스팅 타입의 결과에 차이가 있지만, 하나 b이어야boolean 및 유형 캐스트는 아무것도하지 않습니다.)

그리고 기록상 a &&= b;유효한 Java가 아닙니다. &&=운영자 가 없습니다 .


실제로, 사이에 약간의 의미 차이가 a = a & b;a = a && b;. ( b변수이거나 상수 인 경우 결과는 두 버전에서 동일합니다. b부작용이있는 하위 표현식 인 경우 의미 상 차이 만 있습니다.이 &경우 항상 부작용이 발생합니다. &&경우의 가치에 따라 발생a .)

성능 측면에서 절충점은 평가 b비용과 테스트 비용 및 분기 비용 사이의 a불필요한 할당을 피할 수있는 잠재적 절약 사이에 a있습니다. 분석은 간단하지 않지만 계산 비용이 b사소한 것이 아니라면 두 버전 간의 성능 차이가 너무 작아 고려할 가치가 없습니다.


답변

JLS의 15.22.2 참조 . 부울 피연산자의 경우 &연산자는 비트 단위가 아닌 부울입니다. 부울 피연산자 &&와 의 유일한 차이점은 단락 된 것입니다 (첫 번째 피연산자가 false로 평가되면 두 번째 피연산자가 평가되지 않음).&&&

따라서 귀하의 경우, 경우는 b원시적이다 a = a && b, a = a & b그리고 a &= b모든 할 같은 일.


답변

마지막입니다 :

a = a & b;

답변

테스트하는 간단한 방법은 다음과 같습니다.

public class OperatorTest {
    public static void main(String[] args) {
        boolean a = false;
        a &= b();
    }

    private static boolean b() {
        System.out.println("b() was called");
        return true;
    }
}

출력은 b() was called이므로 오른쪽 피연산자가 평가됩니다.

따라서 다른 사람들이 이미 언급했듯이 a &= b와 같습니다 a = a & b.


답변

a가 이미 false 인 경우 b () 호출을 피하고 싶었던 부울을 사용하여 비슷한 상황을 겪었습니다.

이것은 나를 위해 일했다 :

a &= a && b()