Можно также написать обобщенную управляющую последовательность, где за \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. Какие значения представляют эти литералы? Какой тип имеет каждый из них?