Числовые, логические литералы и литералы-указатели
Литерал — это элемент программы, который непосредственно представляет значение. В этой статье рассматриваются литералы целочисленного типа, с плавающей запятой, логическое значение и указатель. Сведения о строковых и символьных литералах см. в разделе "Строковые и символьные литералы" (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
. Полный список префиксов и суффиксов для каждого типа литерала см. в следующих разделах.
Целочисленные литералы
Целочисленные литералы начинаются с цифры и не имеют дробных частей или экспонент. Целочисленные литералы можно указать в десятичной, двоичной, восьмеричной или шестнадцатеричной форме. При необходимости можно указать целый литерал без знака, а также длинный или длинный тип с помощью суффикса.
Если префикс или суффикс отсутствует, компилятор даст целочисленному литеральному типу (32 бита), если значение будет соответствовать, в противном случае он даст ему тип int
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
и a
9
(или) через f
(или F
A
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
Разделители цифр: вы можете использовать символ с одним кавычками (apostrophe) для разделения значений в больших числах, чтобы упростить чтение для людей. Разделители не влияют на компиляцию.
long long i = 24'847'458'121;
Литералы с плавающей запятой
Литералы с плавающей запятой задают значения, которые должны иметь дробную часть. Эти значения содержат десятичные знаки (.
) и могут содержать экспоненты.
Литералы с плавающей запятой имеют символику (иногда называемую мантиссой), которая задает значение числа. Они имеют экспонент, который указывает величину числа. И у них есть необязательный суффикс, указывающий тип литерала. Знак указывается в виде последовательности цифр, за которым следует период, за которым следует необязательная последовательность цифр, представляющая дробную часть числа. Например:
18.46
38.
Если указан показатель степени, он задает порядок числа в виде степени 10, как показано в следующем примере:
18.46e0 // 18.46
18.46e1 // 184.6
Экспонент может быть указан с помощью e
или E
, которые имеют то же значение, за которым следует необязательный знак (+ или -) и последовательность цифр. Если указан показатель степени, десятичная точка в конце целых чисел не требуется, например 18E0
.
Литералы с плавающей запятой по умолчанию для типа double
. Используя суффиксы f
или или F
l
L
(суффикс не учитывает регистр), литерал можно указать как float
или.long double
Хотя long double
и double
имеют то же представление, они не одинаковы. Например, у вас могут быть перегруженные функции, такие как
void func( double );
и
void func( long double );
логические литералы
Логические литералы и true
false
.
Литерал-указатель (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++
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по