다른 답변은 연산자 간의 기능적 차이를 다루는 데 도움이되었지만 오늘날 존재하는 거의 모든 C 파생 언어에 적용 할 수 있습니다. 질문이 태그되었습니다자바Java 언어에 대해 구체적이고 기술적으로 답변하기 위해 노력할 것입니다.
&
및 |
정수 비트 연산자 또는 부울 논리 연산자 중 하나가 될 수 있습니다. 비트 및 논리 연산자 ( §15.22 ) 의 구문은 다음과 같습니다.
AndExpression:
EqualityExpression
AndExpression & EqualityExpression
ExclusiveOrExpression:
AndExpression
ExclusiveOrExpression ^ AndExpression
InclusiveOrExpression:
ExclusiveOrExpression
InclusiveOrExpression | ExclusiveOrExpression
위한 구문 EqualityExpression
으로 정의 §15.21 필요 RelationalExpression
에 정의 §15.20 차례로 요구 ShiftExpression
하고 ReferenceType
정의 §15.19 및 §4.3 각각. ShiftExpression
필요 AdditiveExpression
에 정의 §15.18 기본 등 산술, 단항 연산자, 정의, 드릴 다운을 계속하는 ReferenceType
유형을 대표하는 모든 다양한 방법으로 드릴 다운합니다. (반면 ReferenceType
프리미티브 타입을 포함하지 않는가 배열을위한 측정 유형 수있는 바와 같이, 기본 형태의 정의는 궁극적으로 필요 하다ReferenceType
).
비트 연산자와 논리 연산자에는 다음과 같은 속성이 있습니다.
- 이 연산자는 우선 순위
&
가 가장 높고 우선 순위 |
가 가장 낮은 다른 우선 순위를 갖습니다.
- 이러한 각 연산자는 구문 적으로 왼쪽 연관되어 있습니다 (각 그룹은 왼쪽에서 오른쪽으로).
- 피연산자 표현식에 부작용이없는 경우 각 연산자는 정식입니다.
- 각 연산자는 연관되어 있습니다.
- 비트 및 논리 연산자를 사용하여 숫자 유형의 두 피연산자 또는 유형의 두 피연산자를 비교할 수 있습니다
boolean
. 다른 모든 경우에는 컴파일 타임 오류가 발생합니다.
연산자가 비트 연산자인지 논리 연산자인지의 구분은 피연산자가 "기본 정수 유형으로 변환 가능"하는지 ( §4.2 ) 또는 유형 boolean
인지 또는 Boolean
( §5.1.8 ) 인지에 따라 다릅니다 .
피연산자가 정수 유형 인 경우, 이진 숫자 승격 ( §5.6.2 )이 두 피연산자 모두에서 수행되어 연산에 대해 long
s 또는 int
s 로 남겨 집니다. 연산 유형은 (승격 된) 피연산자의 유형입니다. 이 시점에서 &
비트 AND ^
가되고 비트 배타적 OR |
이되고 비트 비트가 OR이됩니다. ( §15.22.1 )
피연산자가 boolean
또는 Boolean
인 경우, 피연산자는 필요한 경우 개봉 변환을 수행하고 ( §5.1.8 ), 작업 유형은입니다 boolean
. &
초래할 것이다 true
두 피연산자가 있다면 true
, ^
발생할 것이다 true
피연산자가 모두 다른 경우 및 |
발생합니다 true
피연산자 경우 true
. ( §15.22.2 )
반대로 &&
"조건부 및 연산자"( §15.23 )이고 ||
"조건부 또는 연산자"( §15.24 )입니다. 그들의 구문은 다음과 같이 정의됩니다.
ConditionalAndExpression:
InclusiveOrExpression
ConditionalAndExpression && InclusiveOrExpression
ConditionalOrExpression:
ConditionalAndExpression
ConditionalOrExpression || ConditionalAndExpression
&&
&
왼쪽 피연산자가이면 오른쪽 피연산자 만 평가한다는 점을 제외하고 는 같습니다 true
. 왼쪽 피연산자가이면 오른쪽 피연산자 만 평가한다는 점을 제외하고 ||
는 같습니다 .|
false
조건부 및 속성은 다음과 같습니다.
- 조건부 및 연산자는 구문 적으로 왼쪽 연관입니다 (왼쪽에서 오른쪽으로 그룹화 됨).
- 조건부 및 연산자는 부작용 및 결과 값과 관련하여 완전히 연관됩니다. 즉, 임의의 표현을 위해
a
, b
그리고 c
, 식의 평가는 ((a) && (b)) && (c)
동일한 부작용 발현의 평가로서, 동일한 순서로 발생하여, 동일한 결과를 생성한다 (a) && ((b) && (c))
.
- 조건부 및 연산자의 각 피연산자 유형은
boolean
또는 이어야합니다. 그렇지 않으면 Boolean
컴파일 타임 오류가 발생합니다.
- 조건부 및 표현식의 유형은 항상
boolean
입니다.
- 런타임시 왼쪽 피연산자 표현식이 먼저 평가됩니다. 결과에 유형이 있으면 개봉
Boolean
변환 ( §5.1.8 ) 이 적용됩니다 .
- 결과 값이
false
인 경우 조건부 및 표현식의 값은 false
이고 오른쪽 피연산자 표현식은 평가되지 않습니다.
- 왼쪽 피연산자의 값이 인 경우
true
오른쪽 표현식이 평가됩니다. 결과에 유형이 있으면 개봉Boolean
변환 ( §5.1.8 ) 이 적용됩니다 . 결과 값은 조건부 및 표현식의 값이됩니다.
- 따라서,
&&
동일한 결과 계산 &
에 boolean
피연산자. 오른쪽 피연산자 표현식이 항상이 아니라 조건부로 평가된다는 점만 다릅니다.
조건부 또는 속성은 다음과 같습니다.
- 조건부 또는 연산자는 구문 적으로 왼쪽 연관입니다 (왼쪽에서 오른쪽으로 그룹화 됨).
- 조건부 또는 연산자는 부작용 및 결과 값과 관련하여 완전히 연관됩니다. 즉, 임의의 표현을 위해
a
, b
그리고 c
, 식의 평가는 ((a) || (b)) || (c)
동일한 부작용 발현의 평가로서, 동일한 순서로 발생하여, 동일한 결과를 생성한다 (a) || ((b) || (c))
.
- 조건부 또는 연산자의 각 피연산자는 유형
boolean
또는 이어야합니다. 그렇지 않으면 Boolean
컴파일 타임 오류가 발생합니다.
- 조건부 또는 표현식의 유형은 항상
boolean
입니다.
- 런타임시 왼쪽 피연산자 표현식이 먼저 평가됩니다. 결과에 유형이 있으면 개봉
Boolean
변환 ( §5.1.8 ) 이 적용됩니다 .
- 결과 값이
true
인 경우 조건부 또는 표현식의 값은 true
이고 오른쪽 피연산자 표현식은 평가되지 않습니다.
- 왼쪽 피연산자의 값이 인 경우
false
오른쪽 표현식이 평가됩니다. 결과에 유형이 있으면 개봉Boolean
변환 ( §5.1.8 ) 이 적용됩니다 . 결과 값은 조건부 또는 표현식의 값이됩니다.
- 따라서 on 또는 피연산자
||
와 동일한 결과를 계산합니다 . 오른쪽 피연산자 표현식이 항상이 아니라 조건부로 평가된다는 점만 다릅니다.|
boolean
Boolean
즉, 같은 @JohnMeagher 반복적으로 의견 지적했다 &
과 |
사실이 아닌 짧은 단락 중 하나 인 피연산자의 특정 케이스에 부울 연산자를, 있습니다 boolean
또는 Boolean
. 모범 사례 (예 : 보조 효과 없음)를 사용하면 이는 약간의 차이입니다. 그러나 피연산자가 boolean
s 또는 Boolean
s 가 아닌 경우 연산자는 매우 다르게 동작합니다 . 비트 및 논리 연산은 단순히 높은 수준의 Java 프로그래밍에서 잘 비교되지 않습니다.