Управляющие последовательности
Управляющие последовательности используются для определения специальных символов внутри строковых литералов и символьных литералов.
Определены следующие управляющие последовательности:
| Управляющая последовательность |
Описание | Представление |
|---|---|---|
| Простые escape-последовательности | ||
\'
|
одинарная кавычка | байт 0x27 в кодировке ASCII |
\"
|
двойная кавычка | байт 0x22 в кодировке ASCII |
\?
|
вопросительный знак | байт 0x3f в кодировке ASCII |
\\
|
обратная косая черта | байт 0x5c в кодировке ASCII |
\0
|
нулевой символ | байт 0x00 в кодировке ASCII |
\a
|
звуковой сигнал | байт 0x07 в кодировке ASCII |
\b
|
возврат на один символ назад ("забой") | байт 0x08 в кодировке ASCII |
\f
|
перевод страницы - новая страница | байт 0x0c в кодировке ASCII |
\n
|
перевод строки - новая строка | байт 0x0a в кодировке ASCII |
\r
|
возврат каретки | байт 0x0d в кодировке ASCII |
\t
|
горизонтальная табуляция | байт 0x09 в кодировке ASCII |
\v
|
вертикальная табуляция | байт 0x0b в кодировке ASCII |
| Числовые escape-последовательности | ||
\nnn
|
произвольное значение в восьмеричной форме | байт ''nnn'' |
\xnn
|
произвольное значение в шестнадцатеричной форме | байт ''nn'' |
| Условные escape-последовательности[1] | ||
\c
|
Определяется реализацией | Определяется реализацией |
| Универсальные имена символов | ||
\unnnn (начиная с C++11)
|
произвольное значение Юникода; результатом могут быть несколько кодовых единиц |
кодовая точка U+''nnnn'' |
\Unnnnnnnn (начиная с C++11)
|
произвольное значение Юникода; результатом могут быть несколько кодовых единиц |
кодовая точка U+''nnnnnnnn'' |
- ↑ Условные escape-последовательности поддерживаются условно. Символ
cв каждой условной escape-последовательности является элементом базового исходного набора символов (до C++23)базового набора символов (начиная с C++23), который не является символом, следующим за\в любой другой escape-последовательности.
Содержание |
[править] Диапазон универсальных имён символов
|
Если имя универсального символа соответствует кодовой точке, отличной от 0x24 ( |
(до C++11) |
|
Если универсальное имя символа, соответствующее кодовой точке элемента базового исходного набора символов или управляющие символы появляются вне символьного или строкового литерала, программа имеет неправильный формат. Если универсальное имя символа, используемое в строковом литерале UTF-16/32, не соответствует кодовой точке в ISO/IEC 10646 (диапазон 0x0-0x10FFFF включительно), программа некорректна. |
(начиная с C++11) (до C++20) |
|
Если универсальное имя символа, соответствующее кодовой точке элемента базового исходного набора символов или управляющие символы появляются вне символьного или строкового литерала, программа имеет неправильный формат. Если имя универсального символа не соответствует кодовой точке в ISO/IEC 10646 (диапазон 0x0-0x10FFFF включительно) или соответствует суррогатной кодовой точке (диапазон 0xD800-0xDFFF включительно), программа некорректна. |
(начиная с C++20) (до C++23) |
|
Если универсальное имя символа соответствует скалярному значению символа в базовом наборе символов или управляющий символ появляется вне символьного или строкового литерала, программа имеет неправильный формат. Если универсальное имя символа не соответствует скалярному значению символа в наборе символов перевода, программа имеет неправильный формат. |
(начиная с C++23) |
[править] Примечания
\0 наиболее часто используемая восьмеричная escape-последовательность, поскольку она представляет собой завершающий нулевой символ в строках с завершающим нулём.
Символ перевода строки \n имеет специальное значение, когда используется в текстовом режиме Ввода/Вывода: он конвертируется в зависящее от операционной системы представление новой строки, обычно один байт или последовательность байт. Вместо этого некоторые системы помечают строки полями длины.
Восьмеричные управляющие последовательности могут содержать не более трёх цифр, но заканчиваются на первом символе, не являющимся восьмеричной цифрой, если он встретился раньше.
Шестнадцатеричные управляющие последовательности не ограничены по длине и заканчиваются перед первым символом, не являющимся шестнадцатеричной цифрой. Если значение, представленное одной шестнадцатеричной управляющей последовательностью, не помещается в диапазон значений представленного символьного типа, используемого в этом строковом литерале (char, char8_t (начиная с C++20), char16_t, char32_t (начиная с C++11) или wchar_t), то результат не определён.
|
Имя универсального символа в узком строковом литерале или 16-битном строковом литерале может отображаться на несколько кодовых единиц, например \U0001f34c это 4 char кодовых единиц в UTF-8 (\xF0\x9F\x8D\x8C) и 2 char16_t кодовых единиц в UTF-16 (\xD83C\xDF4C). |
(начиная с C++11) |
Управляющая последовательность знак вопроса \? используется для предотвращения распознавания триграфов внутри строковых литералов: "??/" будет интерпретировано как "\", но если для второго вопросительного знака использовать управляющую последовательность, то ("?\?/") интерпретируется как "??/". Поскольку триграфы были удалены из C++, управляющая последовательность с вопросительным знаком больше не нужна. Он сохранён для совместимости с C++14 (и предыдущими версиями) и C. (начиная с C++17)
[править] Пример
#include <iostream> int main() { std::printf("Это\nтест\n\nОна сказала: \"Чем чаще чищу, тем чашка чище?\"\n"); }
Вывод:
Это тест Она сказала: "Чем чаще чищу, тем чашка чище?"
[править] Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| CWG 505 | C++98 | поведение было неопределенным, если символ, следующий за обратной косой чертой, не был одним из указанных в таблице |
поддерживается условно (семантика определяется реализацией) |
[править] Смотрите также
| Документация по C для Управляющие последовательности
|

