TL; DR
C 는 다른 언어에서 !
and ~
연산자를 상속했습니다 . 모두 &&
와 ||
다른 사람에 의해 년 후 추가되었다.
긴 답변
역사적으로 C는 초기 언어 B에서 개발되었으며, BCPL은 BCPL을 기반으로했으며 CPL은 Algol을 기반으로했습니다.
C ++, Java 및 C #의 증조 인 Algol 은 프로그래머에게 직관적 인 느낌을주기 위해 참과 거짓을 정의했습니다. 본질적인 적분 값과 동일합니다”. 그러나,이 중 하나 단점은 논리적이고 비트하지가 동일한 작업이 될 수 없다는 것입니다 : 현대의 컴퓨터에서 ~0
-1이 아닌 1과 동일과 ~1
동일 -2보다는 0을 (심지어 일부 육십 세의 메인 프레임에 ~0
나타냅니다 - 모든 CPU에서 0 또는 INT_MIN
, ~0 != 1
C 언어 표준은 수년 동안 그것을 요구했지만, 대부분의 딸 언어는 부호와 크기 또는 보완을 전혀 지원하지 않습니다.)
Algol은 여러 가지 모드를 사용하고 부울 및 정수 모드에서 연산자를 다르게 해석하여이 문제를 해결했습니다. 즉, 비트 연산은 정수 유형에 대한 것이고 논리 연산은 부울 유형에 대한 것입니다.
BCPL은 비트 단위와 논리 형이 아닌 별도의 부울 유형이지만 단일 not
연산자 입니다. C의 초기 선구자가 그 작업을 수행 한 방식은 다음과 같습니다.
R 값이 true이면 비트 패턴이 완전히 하나로 구성됩니다. false의 Rvalue는 0입니다.
참고 true = ~ false
rvalue 라는 용어 가 C 계열 언어에서 완전히 다른 의미로 발전한 것을 볼 수 있습니다. 오늘날 C에서는 "개체 표현"이라고합니다.
이 정의는 논리적 및 비트 단위로 동일한 기계 언어 명령어를 사용하지 않도록합니다. C가 해당 경로를 통과 한 경우 전 세계의 헤더 파일에이라고 표시 #define TRUE -1
됩니다.
그러나 B 프로그래밍 언어 는 약한 유형이며 부울 또는 부동 소수점 유형이 없습니다. 모든 것이 int
그 후임자 C 와 동등 했습니다. 이것은 프로그램이 논리 값으로 참 또는 거짓 이외의 값을 사용할 때 발생하는 상황을 언어가 정의하는 것이 좋습니다. 처음에는 진실한 표현을 "제로와 같지 않음"으로 정의했습니다. 이것은 CPU 제로 플래그가있는 미니 컴퓨터에서 효율적이었습니다.
당시에는 대안이있었습니다. 동일한 CPU에도 음의 플래그가 있었으며 BCPL의 진리 값은 -1 이었으므로 B는 대신 모든 음수를 진실로, 음수가 아닌 숫자를 모두 거짓으로 정의했을 수 있습니다. (이러한 접근 방식에는 하나의 남은 부분이 있습니다. 같은 사람들이 동시에 개발 한 많은 UNIX 시스템 호출은 모든 오류 코드를 음의 정수로 정의합니다. 많은 시스템 호출은 실패시 여러 다른 음수 값 중 하나를 반환합니다.) 감사하십시오 : 그것은 더 나빴을 수 있습니다!
그러나 정의 TRUE
로 1
와 FALSE
같은 0
B에서의 정체성 것을 의미하지 않습니다 true = ~ false
더 이상 개최하고 비트 및 논리적 표현 사이에 명확로 알골을 허용 강한 입력을 떨어졌다. 이를 위해서는 새로운 논리 연산자가 필요했고 디자이너는 !
아마도 같지 않음이 이미 있었기 때문에을 선택했습니다 !=
. 이는 등호를 통해 세로 막대처럼 보입니다. 그들은 아직 존재하지 않았 &&
거나 같은 규칙을 따르지 ||
않았습니다.
틀림없이, 그들은 있어야합니다 : &
B 의 연산자는 설계된대로 고장났습니다. B와 C의에서는 1 & 2 == FALSE
비록 1
및 2
두 truthy 값이며,도 C는 부분적으로 첨가함으로써 해결할하려고 한 실수 B.의 논리 연산 표현하는 더 직관적 인 방법 없다 &&
하고 ||
있지만, 당시의 주요 관심사가 있었다 결국 단락이 작동하여 프로그램이 더 빨리 실행됩니다. 이것의 증거는 더 있다는 것을 없다 ^^
: 1 ^ 2
두 피연산자가 truthy에도 불구하고 truthy 값이지만, 단락 혜택을 누릴 수 없습니다.