Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C와 C++에서 문자 리터럴(문자 상수)의 자료형 차이 완벽 정리

C와 C++은 문법적으로 매우 비슷해 보이지만, 문자 리터럴(character literal)을 다루는 방식에는 중요한 차이가 있습니다. 핵심은 바로 문자 상수의 자료형(type)입니다.

C++에서 문자 상수의 자료형은 char입니다. 반면 C에서는 문자 상수가 int(정수형)로 취급됩니다. 그 결과, 32비트 아키텍처 환경의 C에서는 sizeof('a')가 4를 반환하며, CHAR_BIT는 8입니다. 흥미롭게도 sizeof(char)는 C와 C++ 모두에서 1바이트로 동일합니다.

C 코드 예제

#include<stdio.h>
int main() {
    printf("%d", sizeof('a'));
    return 0;
}

실행 결과

4

C++ 코드 예제

#include<iostream>
using namespace std;
int main() {
    cout << sizeof('a');
    return 0;
}

실행 결과

1

결과 분석

위 두 코드는 사실상 동일한 작업을 수행하지만, 실행 결과는 서로 다릅니다.

  • C의 경우: 문자 상수 'a'가 정수(int)로 승격되어 취급되기 때문에 sizeof('a')는 4를 반환합니다.
  • C++의 경우: 문자 상수 'a'가 문자(char) 그대로 취급되기 때문에 sizeof('a')는 1을 반환합니다.

왜 이런 차이가 발생할까?

C 언어는 초기 설계 당시 문자 상수를 내부적으로 정수값으로 처리하는 전통을 가지고 있으며, 이는 정수 승격(integer promotion) 규칙과도 연관이 있습니다. 반면 C++은 타입 안정성과 함수 오버로딩 같은 기능을 지원하기 위해 문자 상수를 명확히 char 타입으로 정의했습니다. 예를 들어 C++에서는 f('a') 호출 시 f(char) 오버로드가 우선 선택되지만, C에서는 문자 상수가 int이기 때문에 동작 방식이 달라질 수 있습니다.

실무에서 주의할 점

이 차이는 단순한 지식을 넘어 실제 코드에 영향을 줄 수 있습니다. sizeof('a')처럼 문자 상수의 크기를 직접 확인하는 코드나, 매크로·템플릿에서 문자 상수의 타입에 의존하는 코드를 작성할 때는 컴파일 대상 언어(C인지 C++인지)를 반드시 고려해야 합니다. 특히 C와 C++을 혼용하는 프로젝트에서는 의도치 않은 버그의 원인이 될 수 있으니 주의가 필요합니다.