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

C와 C++에서 같은 코드가 다른 결과를 내는 이유와 대표적인 차이점

동일한 소스 코드라도 C 컴파일러로 빌드했을 때와 C++ 컴파일러로 빌드했을 때 서로 다른 결과가 나오는 경우가 있습니다. 두 언어는 문법이 매우 비슷해 보이지만, 내부적으로 처리하는 방식에 중요한 차이가 존재하기 때문입니다. 이 글에서는 그런 대표적인 사례들을 살펴보겠습니다.

1. 문자 리터럴(Character Literal)의 크기 차이

C에서는 문자 리터럴(예: 'a')이 int 타입으로 취급되지만, C++에서는 char 타입으로 취급됩니다. 따라서 sizeof() 연산자로 크기를 확인하면 C에서는 4바이트, C++에서는 1바이트가 출력됩니다.

C 코드 예제

#include<stdio.h>
int main() {
    printf("The character: %c, size(%d)", 'a', sizeof('a'));
}

출력 결과 (C)

The character: a, size(4)

C++ 코드 예제

#include<iostream>
using namespace std;
int main() {
    printf("The character: %c, size(%d)", 'a', sizeof('a'));
}

출력 결과 (C++)

The character: a, size(1)

2. 구조체(struct) 사용 시 태그 필요 여부

C에서 구조체 변수를 선언할 때는 typedef로 별칭을 만들지 않는 한 반드시 struct 키워드(태그)를 함께 사용해야 합니다. 반면 C++에서는 구조체가 새로운 타입으로 정의되기 때문에 struct 키워드 없이 구조체 이름만으로 변수를 선언할 수 있습니다.

C 코드 예제

#include<stdio.h>
struct MyStruct {
    int x;
    char y;
};
int main() {
    struct MyStruct st; // struct 태그가 필요함
    st.x = 10;
    st.y = 'd';
    printf("Struct (%d|%c)", st.x, st.y);
}

출력 결과 (C)

Struct (10|d)

C++ 코드 예제

#include<iostream>
struct MyStruct {
    int x;
    char y;
};
int main() {
    MyStruct st; // struct 태그 없이 사용 가능
    st.x = 10;
    st.y = 'd';
    printf("Struct (%d|%c)", st.x, st.y);
}

출력 결과 (C++)

Struct (10|d)

3. 불리언(Boolean) 타입의 크기 차이

논리값을 표현하는 불리언 타입의 크기도 두 언어에서 다릅니다. C(C99 이전)에는 기본적으로 bool 타입이 존재하지 않아 비교 연산의 결과가 int로 처리되어 4바이트가 되지만, C++에서는 전용 bool 타입이 1바이트로 정의됩니다.

C 코드 예제

#include<stdio.h>
int main() {
    printf("Bool size: %d", sizeof(1 == 1));
}

출력 결과 (C)

Bool size: 4

C++ 코드 예제

#include<iostream>
int main() {
    printf("Bool size: %d", sizeof(1 == 1));
}

출력 결과 (C++)

Bool size: 1

정리

지금까지 살펴본 것처럼, 문자 리터럴의 타입 처리 방식, 구조체 선언 시 struct 태그의 필요 여부, 불리언 타입의 크기 등에서 C와 C++는 미묘하지만 분명한 차이를 보입니다. 두 언어를 함께 다루는 개발자라면 이러한 차이점을 정확히 이해하고 있어야 컴파일 환경에 따른 예상치 못한 동작을 피할 수 있습니다.