비트 연산자가 비교보다 우선 순위가 낮은 이유는 무엇입니까?


63

가장 인기있는 언어 (아래 참고 참조)에서 비교 연산자 (==,! =, <,>, <=,> =)가 비트 연산자 (&, |, ^ ~)?

나는이 우선 순위가 자연 스러울 수있는 곳에서 사용 된 적이 없다고 생각합니다. 항상 다음과 같습니다.

  if( (x & MASK) == CORRECT ) ...   // Chosen bits are in correct setting, rest unimportant

  if( (x ^ x_prev) == SET )      // only, and exactly SET bit changed

  if( (x & REQUIRED) < REQUIRED )   // Not all conditions satisfied

내가 사용하는 경우 :

  flags = ( x == 6 | 2 );     // set bit 0 when x is 6, bit 1 always.

존재하지 않는 것에 가깝습니다.

언어 설계자들이 그러한 우선 순위를 결정하는 동기는 무엇입니까?


예를 들어, 상위 12 개 언어에서 SQL을 제외한 모든 언어는 langpop.com의 프로그래밍 언어 인기 목록 (C, Java, C ++, PHP, JavaScript, Python, C #, Perl, SQL, Ruby, Shell, Visual Basic)과 같습니다.


16
C에서 원래 디자인의 실수
래칫 괴물

7
@ gnat, 그 불만의 요점은 무엇입니까? OP는 "모두"라고 말하지 않고 "가장 인기있는 언어"라고 말했습니다. 그리고 대다수는이 순서를 따릅니다. 이 표에서 상위 12 개 (SQL) 중 하나만 지원하지 않습니다. langpop.com

3
@ dan1111 포인트는 자연스럽게 응답자가 질문을보다 잘 이해하고 더 나은 답변을 제공 할 수 있도록 돕는 것입니다. 알다시피, 이것은 추측 게임 의 장소가 아닙니다. 또는 투어 페이지에서 "토론 포럼이 아닙니다. 잡담은 없습니다."
gnat

7
@ gnat, 나는 게임 추측에 대한 귀하의 우려에 동의하지만, 거의 모든 인기있는 언어가 묘사 된 행동을 나타낼 때 이것이 자격이 있다고 생각하지 않습니다.

5
@ 덩크 : 일반적인 "직감으로"접근 방식은 [arithmetics] [logic operator] [arithmetics]입니다. 대부분의 프로그래머는 괄호를 엉망으로 만들지 않습니다. if(((x+getLowX()) < getMinX) || ((x-getHighX())>getMaxX())))대부분은 논리보다 산술의 if( ( x + getLowX() < getMinX ) || ( x - getHighX() > getMaxX() )) 우선 순위를 가정하고 +위의 우선 순위를 가정 <합니다. 이제 if( x ^ getMask() != PATTERN ) XOR은 산술 연산자 인 것처럼 직관적으로 동일하게 동작해야합니다. 그것이 if( x ^ ( getMask() != PATTERN ) )완전히 반 직관적 인 것으로 해석된다는 사실 .
SF.

답변:


72

언어는 C에서 복사했으며 C의 경우 Dennis Ritchie 처음에 B (및 초기 C) &에는 문맥에 따라 비트 단위 또는 논리적 인 형식 이 한 가지 형식 만 있다고 설명 했습니다 . 나중에 각 함수 &에는 비트 단위 및 &&논리 함수에 대한 연산자가 있습니다. 그런 다음 그는 계속

그들의 지각 소개는 C의 우선 순위 규칙이 부적절하다는 것을 설명합니다. B에서는 씁니다

if (a == b & c) ...

여부를 확인하려면 a등호 bc비 - 제로; 이러한 조건식에서는 &보다 우선 순위가 낮은 것이 좋습니다 ==. B에서 C로 변환 할 때 그러한 진술에서 대체 &를 원합니다 &&. 변환이 덜 고통스러운하기 위해, 우리는의 우선 순위 유지하기로 결정 &동일한 상대에 대한 연산자를 ==, 그리고 단지의 우선 순위를 분할 &&약간 &. 오늘날, 그것의 상대적 우선 순위를 가지고 이동하는 것이 바람직했을 것 같다 &하고 ==, 따라서 일반적인 C 관용구를 단순화 : 다른 값에 대한 마스크 값을 테스트하기 위해, 하나는 작성해야합니다

if ((a & mask) == b) ...

내부 괄호가 필요하지만 쉽게 잊혀지는 곳.


1
c=2Or가 a==b결과를 얻었 을 때 실패 ~0하지 1않습니까?
SF.

a == b는 0 또는 1을 반환합니다 ( cm.bell-labs.com/cm/cs/who/dmr/kbman.html 참조) .
AProgrammer

답변에서 참조를 확인하고 앞의 텍스트를 읽으십시오.
SShaheen

1
@MasonWheeler : 특히 임베디드 시스템의 경우 함수형 매크로를 사용해야하는 경우가 있습니다. 일부 경우 인라인 함수보다 중요도가 높은 성능을 제공 할 수 있으며 일부 임베디드 시스템에서는 중요 할 수 있습니다. 이러한 매크로 내에서 변수 선언은 불가능합니다. 매크로 내에서 전역 변수를 사용하면 작동하지만 실제로는 불안정합니다.
supercat

6
@MasonWheeler : 1000의 수량이 $ 0.50 인 Raspberry Pi 또는 Arduino를 찾을 수 있습니까?
supercat

7

비트 연산자는 개념적으로나 외형 적으로 논리 연산자와 관련이 있으며, 우선 순위표에서 왜 서로 가까이 있는지 설명합니다. 아마 하나도 것이 혼란 스러울 것이라고 주장 할 수 &보다 높게 ==, 아직 &&다음 낮은 ==.

우선 순위 선행 (!)이 설정되면 일관성을 위해 다른 언어가 우선하는 것이 더 낫습니다.

그러나 이것이 최적이 아님에 동의하는 경향이 있습니다. 실제 사용에서 비트 연산자는 논리 연산자보다 수학 연산자와 비슷하며 수학 연산자와 우선 순위가 그룹화되어 있으면 더 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.