문제

난 네가 할 수 있다는 걸 알아 #define 일부 정수가 있지만 C99 이전에는 C에 전용 부울 데이터 유형이 없었던 이유는 무엇입니까?

이는 프로그래밍과 논리에서 흔히 발생하는 일이므로 명시적인 유형과 표기법이 없다는 것을 이해하지 못합니다.

도움이 되었습니까?

해결책

도서관에서 약간의 시간을 보내면 추측 할 필요가 없습니다. 다음은 몇 가지 진술이 있습니다 C.의 진화에 관한 Dennis Ritchie의 논문. 맥락은 Dennis가 Ken Thompson 's Language B를 기반으로하고 있으며, 이는 단어가 부러진 기계 인 매우 작은 PDP-7에 구현 된 것입니다. 관심이 커지면서이 그룹은 최초의 PDP-11 중 하나를 얻었습니다. 데니스는 썼다.

PDP-11의 출현은 B의 시맨틱 모델의 몇 가지 부주의를 노출시켰다. 첫째, BCPL의 변화가 거의없는 캐릭터 취급 메커니즘은 서투른 것입니다. 라이브러리 절차를 사용하여 포장 된 문자열을 개별 셀로 펼친 다음 개별 문자를 재 포장하거나 개별 문자에 액세스하고 교체하기 위해 어색한 느낌이 들기 시작했습니다. 바이트 지향 기계.

B와 BCPL 모델은 포인터를 다루는 데 오버 헤드를 암시했다. 언어 규칙, 포인터를 다양한 단어의 색인으로 정의함으로써 강제 포인터는 단어 지수로 표현되도록 강요했다. 각 포인터 참조는 포인터에서 하드웨어에서 예상되는 바이트 주소로 런타임 스케일 변환을 생성했습니다.

이러한 모든 이유로, 캐릭터 및 바이트 주소에 대처하고 다가오는 부동 소수점 하드웨어를 준비하는 데 타이핑 체계가 필요했던 것처럼 보였습니다. 다른 문제, 특히 유형 안전 및 인터페이스 점검은 나중에 나온 것만 큼 중요하지 않은 것처럼 보였습니다.

(강조 광산.)

이 논문은 계속해서 새로운 포인터 의미를 발명하고, 배열을 만들고,이 새로 얽힌이 새로운 용어를 다루기위한 데니스의 투쟁을 묘사합니다. struct 아이디어. 타입 안전 개념과 정수와의 부울을 구별하는 개념은 훨씬 나중에까지 중요하지 않은 것처럼 보였다 :-)

다른 팁

C는 실제로 상위 수준의 어셈블리 언어에 지나지 않습니다. 그렇습니다. 제어 구조와 그 내용이 없었으며 어셈블러에 확실히 필요하지 않은 유형도 있습니다.

그러나 언어는 수십 년 전에 설계되었습니다. 그리고 모든 부울 결과는 프로세서의 상태 단어에서 개별 비트로 내려 지므로 통합 데이터 유형을 사용하는 것만으로 충분했습니다. 그리고 일부 유형 확인을 생략 할 수 있기 때문에 컴파일러를 조금 덜 복잡하게 만들었습니다 (나중에 언어 제어 구조로 필요 부울 값, C에서는 0 또는 다른 것의 적분 값이 필요합니다).

0을 거짓으로, 0이 아닌 사람을 사실로 취급하는 것이 일반적이었습니다 (일부 경우에는 여전히 경우에도 여전히). 이것은 속기에 대한 장점이 있습니다. 예를 들어, 대신 while (remaining != 0) 당신은 그냥 사용할 수 있습니다 while (remaining).

일부 언어는 참으로 -1입니다. 그 이유는 TWOS- 보상 표기법 (대부분의 컴퓨터가 음수를 나타내는 데 사용하는)에서 0의 비트가 아닌 사람은 -1 (8 비트 바이너리, 11111111 10 진수 -1).

시간이 지남에 따라 컴파일러 정의 된 상수를 사용하면 많은 잠재적 혼란을 막을 수 있습니다. C ++를 해낸 지 오래되었지만 0이 아닌 값이 여전히 "True"를 평가할 것이라고 확신합니다.

CPU에는 "부울 유형"이 없으며 바이트와 배수에서만 작동하므로 부울 유형은 이점을 제공하지 않았기 때문에 의미가 없습니다 ( "IS 0"이라는 유형을 사용하는 이유는 "0"입니다. 또는 "널 아님")

나는 정수 유형을 갖는 것으로 충분하다고 생각하고 0은 거짓이고 0은 0이 아닙니다.

부울 (보통)을 저장하는 데 사용하는 유형은 공간과 시간 사이에 상충 관계를 구현합니다. 일반적으로 INT (일반적으로 4 바이트)를 사용하여 가장 빠른 결과 (적어도 개별 작업의 경우)를 얻을 수 있습니다. 반면에, 당신이 매우 많은 것을 사용하는 경우, 하나의 바이트를 사용하거나 포장하는 것이 훨씬 더 의미가있을 수 있으므로 저장하는 각 값은 단일 비트 만 사용하지만, 그렇게 할 때/만약. 단일 비트를 읽거나 쓰는 것이 크게 비싸게됩니다 (추가 코드를 사용합니다).

실제로 "올바른"대답이 없었기 때문에, 그들은 자신이 쓰고있는 프로그램의 요구 사항에 따라 사용자에게 결정을 남겼습니다.

그러므로 실제 질문은 C99에 부울 유형이 추가 된 이유입니다. 내 생각에 몇 가지 요인이 관련되어 있다는 것입니다. 첫째, 그들은 프로그래머의 가독성과 편의성이 이제 절대 최고의 성능을 제공하는 것보다 일반적으로 더 중요하다는 것을 깨달았습니다. 둘째, 컴파일러는 이제 훨씬 더 글로벌 분석을 수행하므로 누군가가 ~할 것 같다 특정 프로그램에 가장 적합한 표현을 선택하려는 컴파일러를 작성하십시오 (실제로는 알지 못하지만).

이전 C에는 실제로 부울 유형이 "빠진" 것이 아닙니다. 단지 모든 정수 유형이 부울을 저장하는 이중 작업을 수행하는 데 적합한 것으로 간주되었을 뿐입니다.이에 대한 두 가지 주요 이유를 볼 수 있습니다.

  • 비트 주소 지정 프로세서는 전혀 일반적이지 않았고 지금도 그렇지 않습니다. 따라서 컴파일러는 공간을 절약하기 위해 실제로 "진정한 부울" 유형을 사용할 수 없습니다. 부울은 여전히 ​​적어도 다음과 같은 크기입니다. ㅏ char 어쨌든(효율적으로 액세스하려는 경우).

  • 다음보다 좁은 유형 int 로 확대되었습니다 int 어쨌든 표현식에서는 부울 연산자가 계속 작동합니다. int 피연산자.

..그래서 전용 부울 유형이 실제로 실질적인 이점을 전달할 만큼 설득력 있는 사례가 없었던 것 같습니다.

C 언어에는 부울 결과(0 또는 1로 정의됨)를 생성하는 일련의 연산자가 있다는 점을 기억하십시오. !, &&, ||, !=, ==, <, <=, > 그리고 >= - 따라서 존재하지 않는 전용 부울 유형일 뿐입니다.

아마도 역사적 이유 : 아마도 :

Algol의 영향을 많이받은 CPL은 부울 유형을 가졌을 가능성이 높지만 Google-FU는 이에 대한 참조를 찾기에 충분하지 않았습니다. 그러나 CPL은 당시에는 너무 야심적이어서 BCPL이라는 제거 버전을 만들어 냈으며,이 버전은 실제로 사용 가능한 하드웨어에서이를 구현할 수 있다는 이점이있었습니다.

BCPL은 단일 유형 만 ( 'Word') 만 가지고 있었는데, 이는 부울 맥락에서 거짓으로 해석되었습니다. 0 그리고 사실이라면 ~0 (보완을 의미합니다 0, 이는 가치를 나타냅니다 -1 서명 된 TWOS- 보상 정수로 해석 된 경우). 다른 값의 해석은 구현에 따라 다릅니다.

여전히 타이핑이없는 후계자 B 이후, C는 유형 시스템을 재 도입했지만 여전히 전임자의 유형적 특성에 크게 영향을 받았습니다.

정수와 호환되지 않는 별도의 "부울"유형을 추가하면 단순히 목적을 위해 정수를 사용하는 것보다 컴파일러가 더 복잡해 졌을 것입니다. 정수와 호환되는 별도의 부울 유형이 있으면 0 또는 1 이외의 값을 부울 물체에 저장하거나 부울 객체에 숫자 계산을 수행하는 가능한 결과를 지정해야합니다. 0 "또는"1 ". 주어진:

someBool = intFunction();
someInt = someBool;

intfunction이 0이 아닌 값을 반환하는 경우 일부는 값 1을 수신해야합니다.

someChar = intFunction();
someInt = someChar;

이전 시맨틱이 필요한 경우 부울 유형을 사용하지 않고도 다음을 수행 할 수 있습니다.

someChar = !!intFunction();
someInt = someChar;

부울 유형을 사용하여 수행 할 수있는 모든 것은 그들 없이도 수행 할 수 있기 때문에 문자 유형을 사용하는 코드는 부울 유형보다 더 효율적 일 수 있으므로 실제는 없었으며 여전히 그렇지 않다고 제안합니다. 그들에게 필요합니다.

그들은 하나를 넣지 않았기 때문에. 그것이 말을 많이하는 소리가 들리면 죄송하지만 기본적으로는 정의되지 않았습니다.

대부분의 사람들을 #진실과 거짓을 기억하십시오.

당신은 bool이 표준이라고 말할 수도 있지만, 분명히 C99 이전에는 표준이 아니 었습니다. 10 년 전에 만들어졌습니다.) 그들은 놓친 품목이 분명해 졌을 때 그것을 추가했습니다.

프로그래밍 언어로 누락 된 데이터 유형을 포함한 모든 것을 예측할 수 없기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top