아래와 같은 코드를 가정해 볼께요
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()