이 문서의 내용
문자 리터럴(Chacter literals)
문자 리터럴은 상수 문자로 구성됩니다. 상수 문자는 작은 따옴표 '로 둘러싸인 문자입니다.
문자 리터럴 유형은 다음 5가지로 구분됩니다.
구분 | 예시 | 지원 버전 |
모든 버전에서 지원 | ||
UTF-8의 |
||
UTF-16의 |
||
UTF-32의 |
||
와이드 문자의 |
모든 버전에서 지원 |
문자 리터럴에서는 예약어에 해당하는 백슬래시 \ 작은 따옴표 ' 개행 등을 사용 할 수 없습니다.
예약어를 문자 리터럴에서 사용하려면 이스케이프 시퀀스 \를 사용합니다.
구분 | 이스케이스 시퀀스 |
\n | |
인코딩(Encoding)
문자 리터럴은 접두사를 기반으로 인코딩 유형이 결정됩니다.
인코딩 유형 | 데이터 타입 | 비고 | 예시 |
접두사 없는 문자 리터럴입니다. | |||
접두사 |
|||
접두사 |
|||
접두사 |
|||
접두사 |
다중 문자(Multicharacter) 리터럴
다중 문자 리터럴을 만들기 위해서 컴파일러는 문자 시퀀스를 32비트 integer 타입에서 각각의 문자를 8비트 값으로 변환합니다.
리터럴의 여러 문자는 경우에 따라서 상위에서 하위로 바이트를 채우게 됩니다. 그런 다음 컴파일러는 일반적인 규칙에 따라서 정수를 대상 타입으로 변환합니다.
C++에서 작은 따옴표 사이의 문자는 문자 리터럴입니다. 다중 문자 리터럴은 작은 따옴표 사이에 문자 시퀀스가 포함된 경우, 예를 들어 char c = 'abcd'와 같은 형태를 의미합니다.
일반 문자 리터럴은 char 타입으로 표현되며 다중 문자 리터럴은 int 타입으로 표현됩니다.
예를 들어 char wchar_t 또는 char16_t와 같은 다중 문자 리터럴을 생성하는 과정에서 컴파일러는 하위 문자부터 바이트를 채우며 문자가 잘리는 경우 경고합니다.
char i = 'abcd'; // C4305, C4309, truncates to 'd'
wchar_t j = 'abcd'; // C4305, C4309, truncates to '\x6364'
int k = 'abcd'; // 0x61626364
3자리 이상의 숫자를 포함하는 것처럼 보이는 8진수 이스케이프 시퀀스는 3자리 8진수 시퀀스로 처리됩니다.
따라서 후속 문자 리터럴이 우선 채워지기 때문에 다음과 같은 결과를 가집니다.
char i = '\100'; // '@'
char j = '\1000'; // C4305, C4309, truncates to '0'
문자열 리터럴
문자열 리터럴은 null로 끝나는 문자열을 형성하는 문자 시퀀스입니다.
다중 문자 리터럴이 아닌 문자열 리터럴을 표현하려면 큰 따옴표 "로 문자 시퀀스를 묶어서 사용합니다.
// Before C++ 20
const char* i = u8"Hello World!";
// C++20 and later
const char8_t* j = u8"Hello World!";
예를 들어 UTF-8로 인코딩된 문자열은 u8 접두사로 구분된 const char[n] 배열입니다. 여기서 n은 인코딩된 배열의 길이입니다.
C++ 20부터는 char8_t 타입이 도입되어 접두사 u8을 대신 할 수 있습니다.
const wchar_t* s = L"Hello!";
const size_t size = (wcslen(s) + 1) * sizeof(wchar_t);
std::cout << "size of wchar_t is " << sizeof(wchar_t) << std::endl; // size of wchar_t is 2
std::cout << "length of s is " << wcslen(s) << std::endl; // length of s is 6
std::cout << "size of s is " << size << std::endl; // size of s is 14
ANS char* 문자열 및 기타 단일 바이트 인코딩(UTF-8 제외)의 경우 문자열 리터럴의 크기는 null을 포함합니다.
std::string 리터럴
std::string 리터럴은 표준 라이브러리의 구현으로 C++ 14부터 사용 할 수 있습니다.
#include <string>
using namespace std::string_literals;
int main()
{
std::string s{ "Helleo World"s };
std::string u8si{ u8"Hello World" }; // Before C++ 20
std::u8string u8sj{ u8"Hello World" }; // C++ 20 and later
std::wstring ws{ L"Hello World" };
std::u16string u16s{ u"Hello World" };
std::u32string u32s{ U"Hello World" };
}
std::string 리터럴은 s 접미사를 포함합니다. 해당 접미사를 포함하지 않는 경우 접두사의 형식에 따라서 인코딩 타입의 데이터 타입을 지정합니다.
'C++ > C, C++, STL' 카테고리의 다른 글
Microsoft C++ learn: 토큰(Tokens) 및 문자 집합(Characters sets) (0) | 2024.05.16 |
---|---|
헤더(Header) 파일과 소스 파일 분리 (0) | 2024.02.26 |
정수, 부동 소수점, 부울 및 포인터 리터럴 (0) | 2024.02.22 |
4가지 유형의 형변환(캐스트, Cast) 연산자 (0) | 2024.02.16 |
디폴트 생성자(Default constructors)와 생성자에서의 delete 키워드 (0) | 2024.02.16 |