Character constant
목차 |
구문
'
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 로 구성된 시퀀스입니다.
|
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 이후) |
참고 사항
멀티캐릭터 상수는 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
|