수색…
소개
전통적으로 리터럴은 유형과 값이 철자로 인해 명확한 상수를 나타내는 식입니다. 예를 들어, 42
는 리터럴이고 x
는 타입을 알고 그 값을 알기 위해 이전 코드 라인을 읽어야한다는 선언을보아야하기 때문에 x
는 그렇지 않습니다.
그러나 C ++ 11은 사용자 정의 리터럴 도 추가했습니다.이 리터럴은 전통적인 의미에서는 리터럴이 아니지만 함수 호출의 약식으로 사용할 수 있습니다.
참된
bool
유형의 두 가지 값 중 하나를 나타내는 키워드 입니다.
bool ok = true;
if (!f()) {
ok = false;
goto end;
}
그릇된
bool
유형의 두 가지 값 중 하나를 나타내는 키워드 입니다.
bool ok = true;
if (!f()) {
ok = false;
goto end;
}
nullptr
null 포인터 상수를 나타내는 키워드 . 포인터 나 멤버 유형 포인터로 변환하여 결과 유형의 널 포인터를 생성 할 수 있습니다.
Widget* p = new Widget();
delete p;
p = nullptr; // set the pointer to null after deletion
nullptr
자체는 포인터가 아닙니다. nullptr
유형은 std::nullptr_t
로 알려진 기본 유형입니다.
void f(int* p);
template <class T>
void g(T* p);
void h(std::nullptr_t p);
int main() {
f(nullptr); // ok
g(nullptr); // error
h(nullptr); // ok
}
이
클래스의 멤버 함수 내에서 this
키워드 는 함수가 호출 된 클래스의 인스턴스에 대한 포인터입니다. this
정적 멤버 함수를 사용할 수 없다.
struct S {
int x;
S& operator=(const S& other) {
x = other.x;
// return a reference to the object being assigned to
return *this;
}
};
의 타입 this
멤버 함수의 CV-자격에 따라 결정하는 경우 X::f
이다 const
다음의 유형 this
내 f
이다 const X*
, 그래서 this
내에서 비 정적 데이터 멤버를 수정할 수 없다 const
멤버 함수. 마찬가지로, this
함수는 나타나는 함수에서 volatile
자격을 상속받습니다.
this
비 정적 데이터 멤버에 대해 중괄호 또는 동등 초기 자 에서 사용할 수도 있습니다.
struct S;
struct T {
T(const S* s);
// ...
};
struct S {
// ...
T t{this};
};
this
rvalue이므로 할당 할 수 없습니다.
정수 리터럴
정수 리터럴은 양식의 기본 표현식입니다.
- 소수점 - 리터럴
0이 아닌 10 진수 (0, 1, 2, 3, 4, 5, 6, 7)가 뒤에 오는 0이 아닌 십진수 (1, 2, 3, 4, 5, 6, 7, 8, 9)
int d = 42;
- 8 진수
숫자 0 (0) 다음에 0 개 이상의 8 진수 (0, 1, 2, 3, 4, 5, 6, 7)
int o = 052
- 헥스 리터럴
문자 시퀀스 0x 또는 문자 시퀀스 0X 다음에 하나 이상의 16 진수 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, A, b, B, c, C , d, D, e, E, f, F)
int x = 0x2a;
int X = 0X2A;
- 2 진 - 리터럴 (C ++ 14 이후)
문자 시퀀스 0b 또는 문자 시퀀스 0B 다음에 하나 이상의 이진 숫자 (0, 1)가옵니다.
int b = 0b101010; // C++14
정수 - 접미사 (제공되는 경우)는 다음 중 하나 또는 둘 모두를 포함 할 수 있습니다 (둘 다 제공되면 순서에 관계없이 나타날 수 있음).
- 부호없는 접미사 (문자 U 또는 문자 U)
unsigned int u_1 = 42u;
- long-suffix (문자 l 또는 문자 L) 또는 long-long-suffix (문자 시퀀스 11 또는 문자 시퀀스 LL) (C ++ 11 이후)
다음 변수도 같은 값으로 초기화됩니다.
unsigned long long l1 = 18446744073709550592ull; // C++11
unsigned long long l2 = 18'446'744'073'709'550'592llu; // C++14
unsigned long long l3 = 1844'6744'0737'0955'0592uLL; // C++14
unsigned long long l4 = 184467'440737'0'95505'92LLU; // C++14
노트
정수 리터럴의 문자는 대소 문자를 구분하지 않습니다. 0xDeAdBaBeU와 0XdeadBABEu는 동일한 숫자를 나타냅니다 (한 가지 예외는 긴 또는 긴 접미사이며 ll 또는 LL이며 결코 lL 또는 L1이 아닙니다)
음의 정수 리터럴은 없습니다. -1과 같은 표현식은 리터럴이 나타내는 값에 단항 마이너스 연산자를 적용하며 암시 적 유형 변환이 필요할 수 있습니다.
C99 이전의 C (C ++에서는 아님)에서 long int에 맞지 않는 접미사가없는 십진수 값은 unsigned long int 유형을 가질 수 있습니다.
#if 또는 #elif의 제어 표현식에서 사용되는 경우 모든 부호있는 정수 상수는 유형이 std :: intmax_t 인 것처럼 작동하고 모든 부호없는 정수 상수는 유형이 std :: uintmax_t 인 것처럼 작동합니다.