Числовые, логические литералы и литералы-указатели

Литерал — это элемент программы, который непосредственно представляет значение. В этой статье рассматриваются литералы типа integer, floating-point, boolean и pointer. Сведения о строковых и символьных литералах см. в разделе "Строковые и символьные литералы" (C++). Вы также можете определить собственные литералы на основе любой из этих категорий. Дополнительные сведения см. в описании пользовательских литералов (C++).

Литералы можно использовать во многих контекстах, но наиболее часто они используются для инициализации именованных переменных и для передачи аргументов в функции.

const int answer = 42;      // integer literal
double d = sin(108.87);     // floating point literal passed to sin function
bool b = true;              // boolean literal
MyClass* mc = nullptr;      // pointer literal

Иногда важно указывать компилятору, как следует обрабатывать литерал или какой конкретный тип ему предоставить. Для этого добавьте к литералу префиксы или суффиксы. Например, префикс 0x указывает компилятору интерпретировать число, которое следует за ним как шестнадцатеричное значение, например 0x35. Суффикс ULL указывает компилятору обрабатывать значение как unsigned long long тип, как в 5894345ULL. Полный список префиксов и суффиксов для каждого типа литерала см. в следующих разделах.

Целочисленные литералы

Целочисленные литералы начинаются с цифры и не имеют дробных частей или экспонент. Целочисленные литералы можно указать в десятичной, двоичной, восьмеричной или шестнадцатеричной форме. При необходимости можно указать целочисленный литерал как неподписанный и в виде длинного или длинного типа с помощью суффикса.

Если префикс или суффикс отсутствует, компилятор предоставит целочисленный тип int значения литерала (32 бита), если значение будет соответствовать, в противном случае он даст тип long long (64 бита).

Чтобы указать десятичный целочисленный литерал, начинайте спецификацию с любой цифры, кроме нуля. Пример:

int i = 157;        // Decimal literal
int j = 0198;       // Not a decimal number; erroneous octal literal
int k = 0365;       // Leading zero specifies octal literal, not decimal
int m = 36'000'000  // digit separators make large values more readable

Чтобы указать восьмеричный целочисленный литерал, начинайте спецификацию с нуля, за которым следует ряд цифр в диапазоне от 0 до 7. Цифры 8 и 9 при указании восьмеричного литерала будут ошибками. Пример:

int i = 0377;   // Octal literal
int j = 0397;   // Error: 9 is not an octal digit

Чтобы указать шестнадцатеричный целочисленный литерал, начните спецификацию с 0x или (случай "x" не имеет значения), за которым следует последовательность цифр в диапазоне 0 и 9a (или) через f (илиAF).0X Шестнадцатеричные цифры от a (или A) до f (или F) представляют собой значения в диапазоне от 10 до 15. Пример:

int i = 0x3fff;   // Hexadecimal literal
int j = 0X3FFF;   // Equal to i

Чтобы указать неподписанный тип, используйте суффикс u или U суффикс. Чтобы указать длинный тип, используйте либо L суффиксl. Для указания 64-разрядного целочисленного типа используется суффикс LL или ll. Суффикс i64 по-прежнему поддерживается, но мы не рекомендуем его. Это зависит от корпорации Майкрософт и не является переносимым. Пример:

unsigned val_1 = 328u;                  // Unsigned value
long val_2 = 0x7FFFFFL;                 // Long value specified
                                        //  as hex literal
unsigned long val_3 = 0776745ul;        // Unsigned long value
auto val_4 = 108LL;                           // signed long long
auto val_4 = 0x8000000000000000ULL << 16;     // unsigned long long

Разделители цифр: вы можете использовать одинарный символ кавычки (апостроф) для разделения значений в больших числах, чтобы упростить чтение. Разделители не влияют на компиляцию.

long long i = 24'847'458'121;

Литералы с плавающей запятой

Литералы с плавающей запятой задают значения, которые должны иметь дробную часть. Эти значения содержат десятичные знаки (.) и могут содержать экспоненты.

Литералы с плавающей запятой имеют значимую символику (иногда называемую мантиссом), которая задает значение числа. Они имеют экспоненту, указывающую величину числа. Кроме того, у них есть необязательный суффикс, указывающий тип литерала. Знак указывается как последовательность цифр, за которой следует точка, за которой следует необязательная последовательность цифр, представляющая дробную часть числа. Пример:

18.46
38.

Если указан показатель степени, он задает порядок числа в виде степени 10, как показано в следующем примере:

18.46e0      // 18.46
18.46e1      // 184.6

Экспоненту можно указать с помощью e или E, которые имеют то же значение, за которым следует необязательный знак (+ или -) и последовательность цифр. Если указан показатель степени, десятичная точка в конце целых чисел не требуется, например 18E0.

Литералы с плавающей запятой по умолчанию введите double. С помощью суффиксов f или Fl (Lсуффикс не учитывает регистр), литерал можно указать как float илиlong double.

Хотя long double и double имеют одинаковое представление, они не совпадают с типом. Например, у вас могут быть перегруженные функции, например

void func( double );

и

void func( long double );

логические литералы

Логические литералы и truefalse.

Литерал-указатель (C++11)

В C++ вводится nullptr литерал для указания указателя, начинающегося с нуля. В переносимом коде nullptr следует использовать вместо целочисленного нуля или макросов, таких как NULL.

Двоичные литералы (C++14)

Двоичный литерал можно задать с помощью префикса 0B или 0b и последовательности, состоящей из 1 и 0:

auto x = 0B001101 ; // int
auto y = 0b000001 ; // int

Избегайте использования литералов как «магических констант»

Несмотря на то что это не всегда является хорошим стилем программирования, можно использовать литералы непосредственно в выражениях и операторах:

if (num < 100)
    return "Success";

В предыдущем примере рекомендуется использовать именованную константу, которая передает четкое значение, например "MAXIMUM_ERROR_THRESHOLD". И если возвращаемое значение Success отображается конечными пользователями, лучше использовать именованную строковую константу. Строковые константы можно хранить в одном расположении в файле, который можно локализовать на другие языки. Использование именованных констант помогает вам и другим пользователям понять намерение кода.

См. также раздел

Лексические соглашения
Строковые литералы C++
Пользовательские литералы C++