2016-06-07 4 views
0

나는 최근에 내가 가진 C 프로그램의 버그를 수정 !=|보다 우선합니다.연산자 우선 순위 (! =와)

제 질문은 이것이 다른 이유는 아닙니다. 내 경험에 의하면 a == b || a == c 또는 d == (a | b | c)을 자주 사용하지만 결코 a == b | c == d을 사용하지 않습니다.

이 선택의 논리는 무엇입니까?

+0

'foobar! = FOO | 바 | BAZ는'(foobar!= FOO) | 바 | 왜냐하면'! ='의 선행이'|'보다 높기 때문입니다. 원하는대로 사용하십시오. – MikeCAT

+0

하나는 이진 산술 연산자 ('|')이기 때문에 다른 산술 연산자와 같은 레벨에 속하며 다른 연산자는 논리 연산자 ('||')입니다. – m0skit0

+0

이것이 언어 설계자가 결정한 방법입니다. –

답변

4

그것은 역사적인 이유, 데니스 리치에서 인용이 있습니다

는 "초기 C는 & 및 & & 나에 대한 별도의 사업자 없었다 |를 및 || 대신 '진리 값 컨텍스트'의 개념 (B 및 BCPL에서 상속 됨)을 사용했습니다. 'if'와 'while'후에 부울 값이 예상되는 곳 등. & 및 | 운영자는 & &으로 해석되었고 || 현재 입니다. 보통 표현에서 비트 단위 해석이 사용되었습니다. 꽤 잘 풀었지만 설명하기가 어려웠습니다. (진리 값 컨텍스트에서 '최상위 연산자'라는 개념은 입니다.) 우선 순위가 &이고 | 그들은 지금 그대로였다.

앨런 스나이더 (Alan Snyder)를 우선적으로 촉구하면서, & & 및 || 연산자가 추가되었습니다. 이렇게 성공적으로 은 비트 단위 연산의 개념과 단락 회로 부울 계산을 분리했습니다. 그러나 나는 우선 순위에 대해 차가운 ​​발을 가지고있었습니다. 문제. 예를 들어, 같은 것들로 많은 프로그램이 있었다 : 는 경우 (A == B를 & C == D) ... 돌이켜

"

는 앞서 가서 이상으로 &의 우선 순위를 변경하는 것이 더 나은했을 것이다 ==보다,하지만 안전 그냥 기존 운영자 과거 &를 이동하지 않고 & 및 & &을 분할하는 것 같았다. "

0

데니스 리치의 Development of the C Language이 다른 호기심 역사적 유물을 포함한다.

는 기본적으로 원래 언어는 &&|| 사업자가 없었어요 - 단지 &|을, 그래서 a == b | c == d 같은 당신 쓰기 것. 선행 규칙은이를 기반으로 설계되었습니다.

나중에 짧은 ciruiting 연산자가 추가되었지만 이전 연산자의 우선 순위는 수정되지 않았습니다.