Последовательности экранирования
Последовательности экранирования используются для представления определённых специальных символов в строковых литералах и литералах символов.
Доступны следующие последовательности экранирования:
| Последовательность экранирования | Описание | Представление |
|---|---|---|
| Простые последовательности экранирования | ||
\' | одинарная кавычка | байт 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 |
| Числовые последовательности экранирования | ||
\nnn | произвольное восьмеричное значение | код единицы nnn (1~3 восьмеричных цифры) |
\o{n...} (с C++23) | код единицы n... (произвольное количество восьмеричных цифр) |
|
\xn... | произвольное шестнадцатеричное значение | код единицы n... (произвольное количество шестнадцатеричных цифр) |
\x{n...} (с C++23) |
||
| Условные последовательности экранирования[1] | ||
\c | Определяемое реализацией | Определяемое реализацией |
| Универсальные имена символов | ||
\unnnn | произвольное значение Unicode; может привести к нескольким кодовым единицам | код точки U+nnnn (4 шестнадцатеричных цифры) |
\u{n...} (с C++23) | код точки U+n... (произвольное количество шестнадцатеричных цифр) |
|
\Unnnnnnnn | код точки U+nnnnnnnn (8 шестнадцатеричных цифр) |
|
\N{NAME} (с C++23) | произвольный символ Unicode | символ, названный NAME (см. ниже) |
- Условные последовательности экранирования условно поддерживаются. Символ
cв каждой условной последовательности экранирования является членом набора основных символов исходного кода(до C++23)набора основных символов(с C++23) , который не является символом, следующим за\в любой другой последовательности экранирования.
Диапазон универсальных имён символов
| Если универсальное имя символа соответствует кодовой точке, которая не равна 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) |
Имена универсальных последовательностей экранирования
Универсальное имя символа с указанным выше синтаксисом является именем универсального символа. Оно обозначает соответствующий символ в стандарте Unicode (глава 4.8 Имя), если n-char-sequence равно его имени символа или одному из его псевдонимов имени типа «управляющий», «исправление» или «альтернативный»; в противном случае программа является ошибочной. Эти псевдонимы перечислены в базе данных символов Unicode в NameAliases.txt. Ни одно из этих имён или псевдонимов не имеет ведущих или хвостовых пробелов. Действительная n-char-sequence должна содержать только заглавные латинские буквы от A до Z, цифры, пробелы и дефис. Другие символы никогда не встречаются в имени символа Unicode, и, следовательно, их появление в n-char-sequence всегда делает программу ошибочной. | (с C++23) |
Примечания
\0 является наиболее часто используемой восьмеричной последовательностью экранирования, поскольку она представляет заключительный нулевой символ в строках с нулевым завершением.
Символ новой строки \n имеет особое значение при использовании в ввода-выводе в текстовом режиме: он преобразуется в специфичную для ОС новую строку, обычно в виде байта или последовательности байтов. Некоторые системы отмечают свои строки полями длины вместо этого.
Восьмеричные последовательности экранирования имеют ограничение в три восьмеричные цифры, но заканчиваются на первом символе, который не является допустимой восьмеричной цифрой, если он встречается раньше.
Шестнадцатеричные последовательности экранирования не имеют ограничения по длине и заканчиваются на первом символе, который не является допустимой шестнадцатеричной цифрой. Если значение, представленное одиночной шестнадцатеричной последовательностью экранирования, не помещается в диапазон значений, представленных типом символа, используемого в этом строковом литерале (char, char8_t, (с C++20)char16_t, char32_t, (с C++11)или wchar_t), результат является неопределённым.
| Универсальное имя символа в строковой литерале узкого типа или 16-битной строковой литерале может сопоставляться с более чем одним кодовым блоком, например, | (с C++11) |
Экранированная последовательность с вопросительным знаком \? используется для предотвращения интерпретации триграфов внутри строковых литералов: строка, такая как "??/", компилируется как "\", но если второй вопросительный знак экранирован, как в "?\?/", он становится "??/". Так как триграфы были удалены из C++, экранированная последовательность с вопросительным знаком больше не требуется. Она сохранена для совместимости с C++14 (и предыдущими редакциями) и C.(с C++17)
| Макрос проверки функции | Значение | Std | Функция |
|---|---|---|---|
__cpp_named_character_escapes | 202207L | (C++23) | Имена универсальных символьных экранирований |
Пример
#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++.
| DR | Применимо к | Поведение при публикации | Правильное поведение |
|---|---|---|---|
| CWG 505 | C++98 | поведение было неопределенным, если символ, следующий за обратной косой чертой, не был одним из указанных в таблице | сделано условно поддерживаемым (семантика определяется реализацией) |
См. также
| C документация для Экранированная последовательность |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/escape