리터럴(Literals)은 값을 직접적으로 표현하는 프로그램 요소입니다.
리터럴은 여러 컨텍스트에서 사용 할 수 있지만 가장 일반적인 사용은 변수의 초기화 그리고 함수에 인자 전달입니다.
C++의 정수 부동 소수점 부울 및 포인터 리터럴 유형은 다음과 같습니다.
const int answer = 43; // integer literal
double d = sin(108.87); // floating point literal passed to sin function
bool b = true; // boolean literal
MyClass* mc = nullptr; // pointer literal
일부 리터럴의 경우 접두사 및 접미사를 추가 컴파일러에게 해석하는 방법을 알려야 합니다.
예를 들어 0x35의 접두사 0x는 컴파일러에게 이어지는 숫자를 16진수로 해석하도록 알리는 목적입니다.
정수 리터럴(Integer literals)
정수 리터럴은 10진수(Decimal) 이진(Binary) 8진수(Octal) 16진수(Hexadecimal)로 표현됩니다.
int i = 157; // decimal literal
int j = 0198; // octal literal
int k = 0x3fff; // hexadecimal literal
정수 리터럴: 10진수
10진수 정수 리터럴을 지정하려면 0이 아닌 숫자로 시작합니다.
int i = 157;
리터럴이 표현하는 값의 크기에 따라서 컴파일러는 정수 리터럴을 int(32Bit) 또는 long long(64Bit) 타입으로 결정합니다.
#include <iostream>
int main()
{
std::cout << 360 << " is " << typeid(360).name() << std::endl; // __int32
std::cout << 3600000000 << " is " << typeid(3600000000).name() << std::endl; // __int64
}
정수 리터럴: 8진수
8진수 정수 리터럴을 지정하려면 0으로 시작하여 나머지 리터럴은 0부터 7 사이 숫자의 연속으로 구성합니다.
int i = 0377;
이어지는 숫자 시퀀스는 7을 초과 할 수 없습니다.
int i = 0397; // Error: 9 is not octal digit
정수 리터럴: 16진수
16진수 정수 리터럴을 지정하려면 0x 또는 0X로 시작하여 나머지 리터럴은 0부터 15 사이 숫자의 연속으로 구성합니다.
이때 16진수 숫자 10부터 15까지의 값은 A부터 F(또는 a부터 f)로 나타냅니다.
int i = 0x3fff;
int j = 0X3FFF; // equal to 'i' variable
정수 리터럴: 부호 없는 형식, 큰 숫자 표현
부호 없는 형식은 u 또는 U 접미사를 사용합니다.
더 큰 값을 표현하기 위해 long 타입은 l 또는 L 접미사를, long long 타입은 ll 또는 LL 접미사를 사용합니다.
unsigned i = 328u; // unsigned value
long j = 0x7FFFFFL; // long value specified as hex literal
unsigned long k = 0776745ul; // unsigned long value
auto n = 108LL; // signed long long
auto m = 0x8000000000000000ULL << 16; // unsigned long long
i64 접미사는 Microsoft 전용이며 다른 환경에서 호환되지 않을 수 있으므로 권장하지 않습니다.
작은 따옴표 ' 문자를 사용하면 큰 숫자를 표현할 때 가독성을 높일 수 있습니다.
long long i = 24'847'458'121;
long long j = 24847458121; // equal to 'i' variable
정수 리터럴: 이진 리터럴
이진 리터럴은 0b 또는 0B 접두사로 시작하며 나머지 리터럴은 0 또는 1 숫자의 연속으로 구성합니다.
auto i = 0b000001; // int
auto j = 0B001101; // int
부동 소수점 리터럴(Floating point literals)
부동 소수점 리터럴은 소수 부분이 있어야 하는 값을 표현합니다. 이러한 값은 소수점 .으로 구분되며 지수를 포함합니다.
double i = 18.46;
double j = 38.;
지수가 있는 경우라면 e 또는 E 리터럴을 사용해 10의 거듭제곱으로 지정합니다.
double i = 18.46e0; // 18.46
double j = 18.46e1; // 184.6
부동 소수점 리터럴은 기본적으로 double 타입으로 결정됩니다.
만약 접미사 f 또는 F 그리고 l 또는 L을 사용하는 경우 리터럴을 float 그리고 long double 타입으로 지정 할 수 있습니다.
auto i = 18.46; // double
auto j = 18.46F; // float
auto k = 18.46L; // long double
double과 long double 형식의 표현 값은 동일하지만, 실제는 다른 타입으로 오버로드 될 수 있습니다.
#include <iostream>
void func(double)
{
std::cout << "double func() called" << std::endl;
};
void func(long double)
{
std::cout << "long double func() called" << std::endl;
};
int main()
{
func(123.456); // double func() called
func(123.456L); // long double func() called
}
부울 리터럴(Boolean literals)
부울 형식의 리터럴은 단순히 true 또는 false로 표현됩니다.
포인터 리터럴(Pointer literals)
C++ 11부터 nullptr 리터럴을 도입하여 초기화되지 않은 포인터를 나타낼 수 있습니다.
다른 버전과의 호환성을 고려한다면 기존처럼 NULL을 사용합니다.
char* i = nullptr;
char* j = NULL;
정리 및 복습
10진수정수는 0이 아닌 숫자로 시작합니다.8진수정수는0으로 시작하며 이어지는 리터럴은 0부터 7 사이의 값으로 표현합니다.16진수정수는0x 또는 0X로 시작하며 이어지는 리터럴은 0부터 15 사이의 값으로 표현합니다.- 16진수 정수에서
10부터 15사이의 값은a부터 f또는A부터 F로 표현합니다. 이진수정수는0b또는0B로 시작하며 이어지는 리터럴은 0또는 1로 표현합니다.
10진수 | 8진수 | 16진수 | 이진수 |
0이 아닌 숫자로 시작 | 0으로 시작 | 0x 또는 0X로 시작 | 0b 또는 0B로 시작 |
부동 소수점은.으로 정수와 소수분을 구분합니다.- 부동 소수점에서 지수가 있는 경우라면
e 또는 E리터럴을 사용해10의 거듭제곱으로 지정합니다.
double | float | long dobule |
별도의 리터럴로 지정하지 않은 경우 | f 또는 F 리터럴로 타입 지정 | l 또는 L 리터럴로 타입 지정 |
부울은true또는false로 표현합니다.포인터에서 초기화되지 않은 포인터는NULL또는nullptr(C++ 11)로 표현합니다.
'C++ > C, C++, STL' 카테고리의 다른 글
헤더(Header) 파일과 소스 파일 분리 (0) | 2024.02.26 |
---|---|
문자열 및 문자 리터럴 (0) | 2024.02.26 |
4가지 유형의 형변환(캐스트, Cast) 연산자 (0) | 2024.02.16 |
디폴트 생성자(Default constructors)와 생성자에서의 delete 키워드 (0) | 2024.02.16 |
스마트 포인터(Smart pointer)와 종류 (0) | 2024.02.08 |