Escape-последовательности
Escape-последовательности используются для представления определённых специальных символов в строковых литералах и символьных литералах.
Доступны следующие escape-последовательности:
| Escape- последовательность | Описание | Представление |
|---|---|---|
| Простые escape-последовательности | ||
\' | одинарная кавычка | байт 0x27 в кодировке ASCII |
\" | двойная кавычка | байт 0x22 в кодировке ASCII |
\? | вопросительный знак | байт 0x3f в кодировке ASCII |
\\ | обратная косая черта | байт 0x5c в кодировке 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 (от 1 до 3 восьмеричных цифр) |
\o{n...} (начиная с C++23) | кодовая единица n... (произвольное количество восьмеричных цифр) |
|
\xn... | произвольное шестнадцатеричное значение | кодовая единица n... (произвольное количество шестнадцатеричных цифр) |
\x{n...} (начиная с C++23) |
||
| Условные escape-последовательности[1] | ||
\c | определяется реализацией | определяется реализацией |
| Универсальные имена символов | ||
\unnnn | произвольное значение Unicode; может образовывать несколько кодовых единиц | кодовая точка U+nnnn (4 шестнадцатеричные цифры) |
\u{n...} (начиная с C++23) | кодовая точка U+n... (произвольное количество шестнадцатеричных цифр) |
|
\Unnnnnnnn | кодовая точка U+nnnnnnnn (8 шестнадцатеричных цифр) |
|
\N{NAME} (начиная с C++23) | произвольный символ Unicode | символ, имя которого задано с помощью NAME (см. ниже) |
- Условные escape-последовательности поддерживаются условно. Символ
cв каждой условной escape-последовательности является членом базового набора символов исходного текста(до C++23)базового набора символов(начиная с C++23), который не является символом, следующим за\в любой другой escape-последовательности.
Диапазон универсальных имён символов
| Если универсальное имя символа соответствует кодовой точке, отличной от 0x24 ( | (до C++11) |
| Если универсальное имя символа, соответствующее кодовой точке символа из базового набора символов исходного текста или управляющему символу, встречается вне символьного или строкового литерала, программа некорректна. Если универсальное имя символа соответствует суррогатной кодовой точке (диапазон 0xD800–0xDFFF включительно), программа некорректна. Если универсальное имя символа, используемое в строковом литерале 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) |
Именованные escape-последовательности универсальных символов
Универсальное имя символа, имеющее приведённый выше синтаксис, является именованным универсальным символом. Оно обозначает соответствующий символ в стандарте Unicode (глава 4.8 «Имя»), если n-char-sequence совпадает с именем этого символа или одним из его псевдонимов; в противном случае программа некорректна. Эти псевдонимы перечислены в файле NameAliases.txt из базы данных символов Unicode. Ни одно из этих имён или псевдонимов не содержит пробелов в начале или конце. Допустимый n-char-sequence должен содержать только заглавные латинские буквы от A до Z, цифры, пробелы и дефисы-минусы. Другие символы не встречаются в именах символов Unicode, поэтому их появление в n-char-sequence всегда делает программу некорректной. | (начиная с C++23) |
Примечания
\0 — наиболее часто используемая восьмеричная escape-последовательность, поскольку она представляет завершающий нулевой символ в строках с завершающим нулевым символом.
Символ новой строки \n имеет особое значение при использовании в текстовом режиме ввода-вывода: он преобразуется в зависящее от ОС представление символа новой строки, обычно в байт или последовательность байтов. В некоторых системах строки помечаются полями длины.
Восьмеричные escape-последовательности ограничены тремя восьмеричными цифрами, но завершаются на первом встретившемся символе, который не является допустимой восьмеричной цифрой.
Шестнадцатеричные escape-последовательности не имеют ограничения по длине и завершаются на первом символе, который не является допустимой шестнадцатеричной цифрой. Если значение, представленное одной шестнадцатеричной escape-последовательностью, не входит в диапазон значений, представимых типом символа, используемым в этом строковом литерале (char, char8_t, (начиная с C++20)char16_t, char32_t, (начиная с C++11)или wchar_t), результат не определён.
| Универсальное имя символа в узком или 16-битном строковом литерале может соответствовать нескольким кодовым единицам, например, | (начиная с C++11) |
Escape-последовательность вопросительного знака \? используется, чтобы предотвратить интерпретацию триграфов внутри строковых литералов: строка наподобие "??/" компилируется как "\", но если второй вопросительный знак экранирован, как в "?\?/", она становится "??/". Поскольку триграфы были удалены из C++, escape-последовательность вопросительного знака больше не нужна. Она сохранена для совместимости с C++14 (и более ранними редакциями) и C.(начиная с C++17)
| Макрос проверки поддержки функции | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_named_character_escapes | 202207L | (C++23) | Именованные escape-последовательности универсальных символов |
Пример
#include <iostream>
int main()
{
std::cout << "This\nis\na\ntest\n\n";
std::cout << "She said, \"Sells she seashells on the seashore?\"\n";
}
Вывод:
This is a test She said, "Sells she seashells on the seashore?"
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Исправленное поведение |
|---|---|---|---|
| CWG 505 | C++98 | поведение было неопределённым, если символ, следующий за обратной косой чертой, не был одним из указанных в таблице | поддержка сделана условной (семантика определяется реализацией) |
| P3733R1 | C++23 | псевдонимы в именованных универсальных escape-последовательностях были ограничены категориями «управляющие», «корректирующие» и «альтернативные» | можно использовать псевдонимы любой категории |
См. также
| Документация по C для Escape-последовательности |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/escape