특별한 의미로 미리 정의해 둔 식별자
변수, 함수, 클래스 등 식별자를 정의할 때 미리 정의된 키워드와 똑같은 이름으로 만들 수 없다.
int value = 5;
double value = 0.5;
char value = 'A';
위 코드에서 5, 0.5, 'A'가 모두 리터럴이다. 리터럴은 코드에 직접 표현된 변하지 않는 값 그 자체를 의미하는데 리터럴도 데이터 형식을 가진다.

기본 리터럴이 아니더라도
float value = 0.5f;
unsigned int value = 5u;
long value = 5L;
이렇게 접미사를 붙여서 지정할 수 있는 리터럴도 있다. 접미사는 선택사항으로 생략해도 컴파일은 된다. 하지만 float value = 0.5;처럼 접미사 f를 생략하면 컴파일러는 R-value인 0.5를 float가 아닌 double로 처리한다. 따라서 의도치 않게 정밀도 문제가 발생할 수 있으므로. 리터럴 접미사를 명시해 데이터 형식을 확실하게 지정하는 것이 좋다.
사용자 정의 리터럴
개발자가 직접 새로운 접미사를 만들어서 의미 있는 겂으로 바꿔주는 기능도 있다. 숫자뒤의 접미사를 직접 만들어 특별한 의미로 전환하는 것이다.
#include <iostream>
const long double km_per_mile = 1.609344L;
long double operator"" _km(long double val)
{
return val;
}
long double operator"" _mi(long double val)
{
return val * km_per_mile;
}
int main()
{
long double distance_1 = 1.0_km;
long double distance_2 = 2.0_mi;
std::cout << distance_1 << " km" << std::endl;
std::cout << distance_2 << " km" << std::endl;
std::cout << distance_1 + distance_2 << " km" << std::endl;
}
출력결과
1 km
3.21869 km
4.21869 km
이렇게 반환_타입 operator"" 리터럴_접미사(매개변수_구성)형식을 따라 사용한다.
C언어에서는 내부적으로 char배열을 만들고 해당 배열에 문자를 차례로 하나씩 저장했지만 C++에서는(물론 앞과 같은 방법도 가능)JAVA와 비슷하게 문자열을 좀 더 편리하게 다룰 수 있도록 표준 라이브러리 형태인 string클래스를 지원한다.
#include <iostream>
#include <string> //iostream 헤더에 string도 포함된다.
//책에서는 이렇게 말했지만 엄밀히 말하면 틀린말(X)
//표준상으로는 포함되어 있지 않음. 명시적으로 넣어줄것
using namespace std;
int main() {
//char *str = "Hello world"; //c언어에서 문자열 선언방식
string string_value("Hello world");
string string_value = "Hello world";
}