살아가는 이야기

C의 논리형 본문

컴퓨터, 풀어그림

C의 논리형

우균 2012. 6. 4. 10:38

   C 언어에 논리형이 있을까? 정답을 미리 말하면 없다. 그럼 이렇게 반론하는 사람이 있을지도 모르겠다. "예전에 다음과 같은 코드를 작성했었는데, 잘 돌아가던에요?"

#include <stdio.h>
#include <stdbool.h>

int main() {
    bool flag = true;
    printf("raw output: %d\n", flag);
    printf("str output: %s\n", flag?"true":"false");
    return 0;
}

위 코드는 논리형 bool 타입의 flag 변수를 선언하고 이를 true로 설정한 다음 값을 출력하는 프로그램이다. printf에 %b 같은 것은 없기 때문에 값을 %d로 출력했는데, 그렇게 하면 true는 1, false는 0으로 출력된다. 따라서 두 번째 printf 문에서는 조건 연산자를 이용하여 "true"나 "false"를 출력하도록 한 것이다. 물론 bool 타입과 true, false 상수를 이용하려면 <stdbool.h>를 #include해야 한다.

그런데 왜 '없다'고 한 것일까? 그 이유를 보기 위해 첫 번째 printf 호출을 다음과 같이 바꾸어 보자.

    printf("raw output: %d\n", flag + 1);

정상적이라면 bool 타입 변수 flag와 int 상수 1을 더할 수 없다는 오류나 경고가 나와야 한다. 그러나 아무런 경고나 오류 없이 수행된다. 그러므로 위 bool 타입은 엄밀히 말해서 논리형이 아니다. 사실 <stdbool.h>에도 bool, true, false 등이 매크로로 정의되어 있을 뿐이다. 표준에 따르면 bool은 원래 _Bool이다.

최근 발표된 C11에도 다중스레드, 유니코드 문자 등은 지원하지만 bool 타입은 변함이 없는 것으로 알고 있다. 우리 피부에 와 닿는 변화로는 gets()가 사라졌다는 것이다. 그 동안 버퍼 오버런(buffer overrun)의 주범이었는데, 이것이 gets_s()로 바뀌었다. C11에서 변화된 주요 내용은 위키피디어(http://en.wikipedia.org/wiki/C1X)를 참고하기 바란다.


Comments