C / C ++에서 문자 크기 ( 'a')


298

C와 C ++에서 문자의 크기는 얼마입니까? 내가 아는 한 char의 크기는 C와 C ++에서 1 바이트입니다.

C에서 :

#include <stdio.h>
int main()
{
    printf("Size of char : %d\n", sizeof(char));
    return 0;
}

C ++에서 :

#include <iostream>
int main()
{
    std::cout << "Size of char : " << sizeof(char) << "\n";
    return 0;
}

놀랍지 않게, 둘 다 출력을 제공합니다. Size of char : 1

이제 우리는 같은 문자가 표시되는 것을 알고 'a', 'b', 'c', '|'난 그냥 다음에 위의 코드를 수정 ... 그래서 :

C에서 :

#include <stdio.h>
int main()
{
    char a = 'a';
    printf("Size of char : %d\n", sizeof(a));
    printf("Size of char : %d\n", sizeof('a'));
    return 0;
}

산출:

Size of char : 1
Size of char : 4

C ++에서 :

#include <iostream>
int main()
{
    char a = 'a';
    std::cout << "Size of char : " << sizeof(a) << "\n";
    std::cout << "Size of char : " << sizeof('a') << "\n";
    return 0;
}

산출:

Size of char : 1
Size of char : 1

왜 sizeof('a')C와 C ++에서 다른 값을 반환합니까?


8
"%|"형식은 필요 int인수 (또는를 촉진 무언가를 int). sizeof유형의 결과를 산출합니다 size_t. int캐스트 를 사용하여 변환 하거나 구현에서 지원하는 경우을 사용하십시오 "%zu".
— Keith Thompson

답변:


348

C에서 문자의 형 상수 등이 'a'실제로하다 int(4)의 크기 (또는 다른 구현에 의존 값)와 함께,. C ++에서 유형은 char1이며 크기는 1입니다. 이는 두 언어 간의 많은 작은 차이점 중 하나입니다.


12
C ++ Standard에서는 C 6.4.4.4의 섹션 2.13.2 / 1, 적어도 내가 가지고있는 문서에 있습니다.

14
+1 (단, "4의 크기"는 nthrgeek의 플랫폼에 적용되지만 모든 플랫폼에 반드시 적용되는 것은 아님)
— sbi

28
@nthrgeek : 두 표준을 모두 인용하기에는 너무 게으르지 만 C ++ 표준에는 C와의 비 호환성에 대한 부록이 있습니다. 부록 C.1.1에서는 "문자 리터럴 유형이에서 (으) int로 변경되어 char동작을 설명합니다. :)
— jalf

3
@nthrgeek : §6.4.4.4, 단락 10 : "정수 문자 상수는 int 유형입니다. 단일 바이트 실행 문자에 맵핑되는 단일 문자를 포함하는 정수 문자 상수의 값은 맵핑 된 표현의 숫자 값입니다. "정수로 해석되는 문자입니다."
— Stephen Canon

7
@ nthrgeek : 특정 요점에 대해 논쟁이없고 상대방이 왜 다른 의견을 가지고 있는지 이해하고 싶지 않으면 표준 참조를 요구해서는 안됩니다. 모든 사람이 동의하면 그냥 수락하십시오. 당신은 (개발자로서) 혼자서 이와 같은 일반적인 대답을 빨리 찾을 수있을 정도로 똑똑해야합니다.
— Martin York

26

Paul이 말했듯 이 C에는 있지만 C ++ 에는 있기 때문 'a'입니다 .intchar

몇 년 전에 다음과 같이 작성한 내용에서 C와 C ++의 차이점을 다룹니다. http://david.tribble.com/text/cdiffs.htm


4
궁금한 점이 있지만 C ++ 11 및 C11의 새로운 변경 사항을 포함하도록 해당 문서를 업데이트하고 있습니까?
— Adam Rosenfield

지금은 아닙니다. C와 C ++에 대한 나의 관심은 지난 5 년 동안 크게 줄어 들었습니다.
— David R Tribble

3
글쎄, 나는 당신의 작업을 사용하여 이것을 작성 했고 여기에 당신이 있습니다. 그런 작은 세상!

17

C에서 문자 리터럴의 유형은 C ++에서 int 및 char 입니다. 이것은 함수 오버로딩 을 지원하는 데 필요한 C ++ 입니다. 이 예를보십시오 :

void foo(char c)
{
    puts("char");
}
void foo(int i)
{
    puts("int");
}
int main()
{
    foo('i');
    return 0;
}

산출:

char

5

C 언어 에서 문자 리터럴은 char유형 이 아닙니다 . C는 문자 리터럴을 정수로 간주합니다. 따라서 sizeof('a')와 사이에는 차이가 없습니다 sizeof(1).

따라서 문자 리터럴의 크기는 C의 정수와 같습니다.

C ++ 언어 에서 문자 리터럴은 유형입니다 char. cppreference의 말의 :

1) 좁은 문자 리터럴 또는 일반 문자 리터럴 (예 : 'a'또는 '\n'또는) '\13'. 이러한 리터럴은 유형char 과 실행 문자 세트의 c-char 표현과 동일한 값을 갖습니다. c-char가 실행 문자 세트에서 단일 바이트로 표현할 수없는 경우 리터럴에는 int 유형과 구현 정의 값이 있습니다.

따라서 C ++에서 문자 리터럴은의 유형입니다 char. 따라서 C ++에서 문자 리터럴의 크기는 1 바이트입니다.

Alos, 프로그램에서 sizeof연산자에 잘못된 형식 지정자를 사용했습니다 .

C11 §7.21.6.1 (P9) :

변환 스펙이 유효하지 않은 경우 동작이 정의되지 않습니다.

따라서 %zu대신 형식 지정자를 사용해야 합니다 %d. 그렇지 않으면 C에서 정의되지 않은 동작입니다.


%zu많은 플랫폼에서 지원되는 것이 아니라 더 나은 휴대 성, 사용 (int)sizeof(char)및 형식%d
— chqrlie

문자 리터럴의 값이 반드시 해당 ASCII 코드 인 것은 아닙니다. 소스 및 실행 문자 세트와 char기본적으로 유형의 서명 여부에 따라 다릅니다 .
— chqrlie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.