Java & = 연산자가 & 또는 &&를 적용합니까?


139

가정

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.

답변:


146

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사소한 것이 아니라면 두 버전 간의 성능 차이가 너무 작아 고려할 가치가 없습니다.


"실제로"단락이 잘못되었습니다. && 이상을 사용하는 유일한 이유는 "b"에서 단순하지 않은 부분 표현을 계산하는 것입니다
AlexP

명확히했다. (사실, 사소한 일이 실제로 발생하지는 않습니다.)
Stephen C

51

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

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


2
b가 메소드 호출이면 (a & = b;) 단락되지 않습니까? "&& ="연산자와 같은 것이 있습니까?
is7s

2
이것이 질문에 대답하지 않는 것 같습니다. OP는 이미 단락에 대해 알고있었습니다.
또는 매퍼


0

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

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.


-2

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

이것은 나를 위해 일했다 :

a &= a && b()

25
중복을 피하기 위해 (여전히 단락을 허용 함) 간단히 씁니다 a=a&&b().
Unai Vivi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.