Namespaces
Variants

Character constant

From cppreference.net

목차

구문

' c-char ' (1)
u8' c-char ' (2) (C23부터)
u' c-char ' (3) (C11부터)
U' c-char ' (4) (C11부터)
L' c-char ' (5)
' c-char-sequence ' (6)
L' c-char-sequence ' (7)
u' c-char-sequence ' (8) (C11부터) (C23에서 제거됨)
U' c-char-sequence ' (9) (C11부터) (C23에서 제거됨)

여기서

  • c-char 는 다음 중 하나입니다
  • 기본 원본 문자 집합에서 작은따옴표( ' ), 백슬래시( \ ), 또는 개행 문자를 제외한 문자.
  • 이스케이프 시퀀스: 특수 문자 이스케이프 중 하나 \ ' \ " \ ? \\ \a \b \f \n \r \t \v , 16진 이스케이프 \x... 또는 8진 이스케이프 \... 로서 이스케이프 시퀀스 에 정의된 대로.
(C99 이후)
  • c-char-sequence 는 두 개 이상의 c-char 로 구성된 시퀀스입니다.
1) 1바이트 정수 문자 상수, 예를 들어 'a' 또는 ' \n ' 또는 ' \13 ' . 이러한 상수는 int 타입을 가지며, 그 값은 실행 문자 집합에서 c-char 의 표현을 char 타입 값으로 매핑하여 int 로 변환한 값과 같습니다. 만약 c-char 가 실행 문자 집합에서 단일 바이트로 표현할 수 없는 경우, 그 값은 구현에 따라 정의됩니다.
2) UTF-8 문자 상수, 예를 들어 u8 'a' . 이러한 상수는 char8_t 타입을 가지며, 코드 포인트 값이 단일 UTF-8 코드 단위로 표현 가능한 경우(즉, c-char 가 0x0-0x7F 범위 내에 있는 경우) 그 값은 c-char 의 ISO 10646 코드 포인트 값과 같습니다. 만약 c-char 가 단일 UTF-8 코드 단위로 표현 불가능한 경우, 프로그램은 형식이 잘못되었습니다.
3) 16비트 와이드 문자 상수, 예: u '貓' , 단 u '🍌' ( u ' \U0001f34c ' )는 제외. 이러한 상수는 char16_t 타입을 가지며, mbrtoc16 에 의해 생성된 16비트 인코딩(일반적으로 UTF-16)에서 c-char 의 값과 동일한 값을 가집니다. c-char 가 표현 불가능하거나 둘 이상의 16비트 문자로 매핑되는 경우, 그 값은 구현에 따라 정의됩니다.
4) 32비트 와이드 문자 상수, 예: U '貓' 또는 U '🍌' . 이러한 상수는 char32_t 타입을 가지며, mbrtoc32 에 의해 생성된 32비트 인코딩(일반적으로 UTF-32)에서 c-char 의 값과 동일한 값을 가집니다. c-char 가 표현 불가능하거나 둘 이상의 32비트 문자로 매핑되는 경우, 그 값은 구현에 따라 정의됩니다.
(C23 이전)
3) UTF-16 문자 상수, 예: u '貓' , 단 u '🍌' ( u ' \U0001f34c ' )는 제외. 이러한 상수는 char16_t 타입을 가지며, 단일 UTF-16 코드 유닛으로 표현 가능한 경우(즉, c-char 가 0x0-0xD7FF 또는 0xE000-0xFFFF 범위 내에 있는 경우) c-char 의 ISO 10646 코드 포인트 값과 동일한 값을 가집니다. c-char 가 단일 UTF-16 코드 유닛으로 표현 불가능한 경우, 프로그램은 잘못된 형식입니다.
4) UTF-32 문자 상수, 예: U '貓' 또는 U '🍌' . 이러한 상수는 char32_t 타입을 가지며, 단일 UTF-32 코드 유닛으로 표현 가능한 경우(즉, c-char 가 0x0-0xD7FF 또는 0xE000-0x10FFFF 범위 내에 있는 경우) c-char 의 ISO 10646 코드 포인트 값과 동일한 값을 가집니다. c-char 가 단일 UTF-32 코드 유닛으로 표현 불가능한 경우, 프로그램은 잘못된 형식입니다.
(C23 이후)
5) 와이드 문자 상수, 예를 들어 L 'β' 또는 L '貓 . 이러한 상수는 wchar_t 타입을 가지며, 실행 와이드 문자 집합에서 c-char 의 값과 동일한 값을 가집니다 (즉, mbtowc 에 의해 생성될 값). 만약 c-char 가 표현 불가능하거나 하나 이상의 와이드 문자로 매핑되는 경우 (예: Windows에서 wchar_t 가 16비트일 때의 비-BMP 값), 값은 구현에 따라 정의됩니다.
6) 멀티캐릭터 상수, 예를 들어 'AB' int 타입을 가지며 구현체 정의 값을 가집니다.
7) 와이드 멀티캐릭터 상수, 예를 들어 L 'AB' wchar_t 타입을 가지며 구현체 정의 값을 가집니다.
8) 16비트 멀티캐릭터 상수, 예를 들어 u 'CD' char16_t 타입을 가지며 구현에 따라 정의된 값을 가집니다.
9) 32비트 멀티캐릭터 상수, 예를 들어 U 'XY' char32_t 타입을 가지며 구현에 따라 정의된 값을 가집니다.

참고 사항

멀티캐릭터 상수는 B 프로그래밍 언어에서 C로 계승되었습니다. C 표준으로 명시되지는 않았지만, 대부분의 컴파일러(MSVC는 주목할 만한 예외입니다)는 B에서 명시된 대로 멀티캐릭터 상수를 구현합니다: 상수 내 각 char의 값은 빅엔디안 방식으로 제로 패딩되고 우측 정렬된 순서로 결과 정수의 연속된 바이트들을 초기화합니다, 예를 들어 ' \1 ' 의 값은 0x00000001 이고 ' \1 \2 \3 \4 ' 의 값은 0x01020304 입니다.

C++에서, 인코딩 가능한 일반 문자 리터럴은 char 타입을 가지며, int 타입이 아닙니다.

정수 상수 와 달리, 문자 상수는 char 가 부호 있는 타입인 경우 음수 값을 가질 수 있습니다: 이러한 구현에서는 ' \xFF ' 가 값이 - 1 int 타입입니다.

#if 또는 #elif 의 제어 표현식에서 사용될 때, 문자 상수는 소스 문자 집합, 실행 문자 집합 또는 기타 구현 정의 문자 집합의 관점에서 해석될 수 있습니다.

16/32비트 멀티캐릭터 상수는 널리 지원되지 않으며 C23에서 제거되었습니다. 일부 일반적인 구현(예: clang)은 이를 전혀 허용하지 않습니다.

예제

#include <stddef.h>
#include <stdio.h>
#include <uchar.h>
int main(void)
{
    printf("constant value     \n");
    printf("-------- ----------\n");
    // 정수 문자 상수,
    int c1='a'; printf("'a':\t %#010x\n", c1);
    int c2='🍌'; printf("'🍌':\t %#010x\n\n", c2); // 구현 정의
    // 다중 문자 상수
    int c3='ab'; printf("'ab':\t %#010x\n\n", c3); // 구현 정의
    // 16비트 와이드 문자 상수
    char16_t uc1 = u'a'; printf("'a':\t %#010x\n", (int)uc1);
    char16_t uc2 = u'¢'; printf("'¢':\t %#010x\n", (int)uc2);
    char16_t uc3 = u'猫'; printf("'猫':\t %#010x\n", (int)uc3);
    // 구현 정의 (🍌는 두 개의 16비트 문자로 매핑됨)
    char16_t uc4 = u'🍌'; printf("'🍌':\t %#010x\n\n", (int)uc4);
    // 32비트 와이드 문자 상수
    char32_t Uc1 = U'a'; printf("'a':\t %#010x\n", (int)Uc1);
    char32_t Uc2 = U'¢'; printf("'¢':\t %#010x\n", (int)Uc2);
    char32_t Uc3 = U'猫'; printf("'猫':\t %#010x\n", (int)Uc3);
    char32_t Uc4 = U'🍌'; printf("'🍌':\t %#010x\n\n", (int)Uc4);
    // 와이드 문자 상수
    wchar_t wc1 = L'a'; printf("'a':\t %#010x\n", (int)wc1);
    wchar_t wc2 = L'¢'; printf("'¢':\t %#010x\n", (int)wc2);
    wchar_t wc3 = L'猫'; printf("'猫':\t %#010x\n", (int)wc3);
    wchar_t wc4 = L'🍌'; printf("'🍌':\t %#010x\n\n", (int)wc4);
}

가능한 출력:

constant value     
-------- ----------
'a':	 0x00000061
'🍌':	 0xf09f8d8c
'ab':	 0x00006162
'a':	 0x00000061
'¢':	 0x000000a2
'猫':	 0x0000732b
'🍌':	 0x0000df4c
'a':	 0x00000061
'¢':	 0x000000a2
'猫':	 0x0000732b
'🍌':	 0x0001f34c
'a':	 0x00000061
'¢':	 0x000000a2
'猫':	 0x0000732b
'🍌':	 0x0001f34c

참고문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 6.4.4.5 문자 상수 (p: 63-66)
  • C17 표준 (ISO/IEC 9899:2018):
  • 6.4.4.4 문자 상수 (p: 48-50)
  • C11 표준 (ISO/IEC 9899:2011):
  • 6.4.4.4 문자 상수 (p: 67-70)
  • C99 표준 (ISO/IEC 9899:1999):
  • 6.4.4.4 문자 상수 (p: 59-61)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 3.1.3.4 문자 상수

참고 항목

C++ documentation for Character literal