2012-02-13 4 views
5

이것은 직접 this question에서 영감을 얻은 것입니다.
부울에 적용 할 때 비트 연산자가 단락하지 않을 것이라는 많은 참조/문이 있습니다. 따라서 boolean a = f() & g()인데, f()g()이 모두 부울을 반환하는 경우 모두이 항상 평가됩니다.
그러나, JLS는 말한다 :'단락 논리 연산자가 실제로 단락이되지 않는다는 것을 (사양에서) 보증해야합니까?

15.22.2 부울 논리 연산자 &,^및 |
&,^또는 | 연산자가 부울 또는 부울 유형 인 경우 유형은 비트 연산자 표현식이 부울입니다. 모든 경우에 피연산자 은 필요에 따라 변환 해제 (§5.1.8)의 대상이됩니다.

&의 경우 두 피연산자 값이 모두 참이면 결과 값이 참입니다. 그렇지 않으면 결과는 false입니다.

^의 경우 피연산자 값이 다른 경우 결과 값은 참입니다. 그렇지 않으면 결과는 false입니다.

|에 대해 두 피연산자 값이 모두 거짓이면 결과 값은 false입니다. 그렇지 않으면 결과가 true입니다.

두 피연산자가 실제로 평가된다는 것을 어떻게 보증합니까? xor을 제외하고 인수 중 하나 (그리고 처음에이 두 번째/오른쪽 인 일 수 있음)가 조건을 위반하는 경우에도 결과를 중단하여 결과를 반환 할 수 있습니다.
예 : a & b은 표현식을 false로 평가하려면 b을 false로 평가해야합니다.

참고 사항 :이 방법으로 구현되는지 (단락되지 않는지) 묻지는 않습니다. 물론입니다.

겠습니까 짧은 회로를 구현 언어 기준을 위반 :

내가 부탁 해요?

+0

예. 표준 텍스트는 두 피연산자 값의 값을 나타내며, 두 표현식 모두를 추출해야합니다. – rsp

답변

4

는 참조 JLS 15.7.2 Evaluate Operands before Operation

자바 프로그래밍 언어는 또한 &이 &, ||, 그리고? :) 나타나는 조건 연산자를 제외한 연산자의 모든 피연산자 (완전 작업의 일부를 먼저 평가하는 것을 보장 자체 수행됩니다.

그래서 당신은 모두 피연산자는 최종 결과가 계산되기 전에 평가해야 운영자 &을 가지고있는 경우.

또한 이전 섹션에서는 이진 연산자의 왼쪽 피연산자를 먼저 계산해야한다고 명시 적으로 요청합니다.

+0

잘 잡으세요! 감사! – wmz

+0

이 섹션에 감탄했습니다. –

1

JLS는 조건부 및 조건부에 대해 바로 가기가 수행된다는 것을 명시 적으로 나타냅니다. 조건부 또는 비트 연산자 또는/및 연산자의 동작을 설명합니다. 따라서 shortcutting은 비트 연산자의 동작이 다양하다는 점을 강조합니다.

따라서 표준을 위반하는 단축키를 사용한다고 말합니다. 그것은 확실히 개발자들의 기대에 위배 될 것입니다.

15.24 조건부 - 또는 연산자 ||

& & & 연산자 같다 (§15.22.2),하지만 좌측 피연산자의 값에 해당하는 경우에만 그 오른쪽 피연산자를 평가한다.

관련 문제