Можно также написать обобщенную управляющую последовательность, где за \x
следует одна или несколько шестнадцатеричных цифр или за \
следует одна, две или три восьмеричные цифры. Так можно отобразить символ по его числовому значению. Вот несколько примеров (подразумевается использование набора символов Latin-1):
\7
(оповещение) \12
(новая строка) \40
(пробел)
\0
(нулевой символ) \115
(символ 'M'
) \x4d
(символ 'M'
)
Как и управляющие последовательности, определенные языком, такой синтаксис можно использовать вместо любого другого символа:
std::cout << "Hi \x4dO\115!\n"; //
std::cout << '\115' << '\n'; //
Обратите внимание: если символ \
сопровождается более чем тремя восьмеричными цифрами, то ассоциируются с ним только первые три. Например, литерал "\1234"
представляет два символа: символ, представленный восьмеричным значением 123, и символ 4. Форма \x
, напротив, использует все последующие шестнадцатеричные цифры; литерал "\x1234"
представляет один 16-разрядный символ, состоящий из битов, соответствующих этим четырем шестнадцатеричным цифрам. Поскольку большинство машин использует 8-битовые символы, подобные значения вряд ли будут полезны. Обычно шестнадцатеричные символы с более чем 8 битами используются для расширенных наборов символов с применением одного из префиксов, приведенных в табл. 2.2.
При помощи суффикса или префикса, представленного в табл. 2.2, можно переопределить заданный по умолчанию тип целого числа, числа с плавающей запятой или символьного литерала.
L'a' // литерал типа wchar_t (широкий символ)
u8"hi!" // строковый литерал utf-8 (8-битовая кодировка Unicode)
42ULL // целочисленный беззнаковый литерал, тип unsigned long long
1E-3F // литерал с плавающей точкой и одинарной точностью, тип float
3.14159L // литерал с плавающей точкой и расширенной точностью,
// тип long double
long
используйте букву L
в верхнем регистре; строчная буква l
слишком похожа на цифру 1.
Таблица 2.2. Определение типа литерала
Символьные и строковые литералы | |||
---|---|---|---|
Префикс | Значение | Тип | |
U | Символ Unicode 16 | char16_t | |
U | Символ Unicode 32 | char32_t | |
L | Широкий символ | wchar_t | |
U8 | utf-8 (только строковые литералы) | char | |
Целочисленные литералы | Литералы с плавающей точкой | ||
Суффикс | Минимальный тип | Суффикс | Тип |
u или U | unsigned | f или F | float |
l или L | long | l или L | long double |
Ll или LL | long long |
Можно непосредственно определить знак и размер целочисленного литерала. Если суффикс содержит символ U
, то у литерала беззнаковый тип. Таким образом, у десятичного, восьмеричного или шестнадцатеричного литерала с суффиксом U
будет наименьший тип unsigned int
, unsigned long
или unsigned long long
, в соответствии со значением литерала. Если суффикс будет содержать символ L
, то типом литерала будет по крайней мере long
; если суффикс будет содержать символы LL
, то типом литерала будет long long
или unsigned long long
.
Можно объединить символ U
с символом L
или символами LL
. Литерал с суффиксом UL
, например, задаст тип unsigned long
или unsigned long long
, в зависимости от того, помещается ли его значение в тип unsigned long
.
Слова true
и false
— это логические литералы (литералы типа bool
)
bool test = false
;
Слово nullptr
является литеральным указателем. Более подробная информация об указателях и литерале nullptr
приведена в разделе 2.3.2.
Упражнение 2.5. Определите тип каждого из следующих литералов. Объясните различия между ними:
(a) 'a', L'a', "a", L"a"
(b) 10, 10u, 10L, 10uL, 012, 0xC
(c) 3.14, 3.14f, 3.14L
(d) 10, 10u, 10., 10e-2
Упражнение 2.6. Имеются ли различия между следующими определениями:
int month = 9, day = 7;
int month = 09, day = 07;
Упражнение 2.7. Какие значения представляют эти литералы? Какой тип имеет каждый из них?