Escape sequences
Escape-последовательности используются для представления определённых специальных символов в строковых литералах и символьных литералах .
Доступны следующие escape-последовательности:
|
Escape
sequence |
Описание | Представление |
|---|---|---|
| Простые 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...
}
(since C++23)
|
кодовая единица
n...
(произвольное количество восьмеричных цифр)
|
|
\x
n...
|
произвольное шестнадцатеричное значение |
кодовая единица
n...
(произвольное количество шестнадцатеричных цифр)
|
\x{
n...
}
(since C++23)
|
||
| Условные escape-последовательности [1] | ||
\
c
|
Определяется реализацией | Определяется реализацией |
| Универсальные символьные имена | ||
\u
nnnn
|
произвольное
Unicode
значение;
может приводить к нескольким кодовым единицам |
кодовая точка
U+
nnnn
(4 шестнадцатеричных цифры)
|
\u{
n...
}
(since C++23)
|
кодовая точка
U+
n...
(произвольное количество шестнадцатеричных цифр)
|
|
\U
nnnnnnnn
|
кодовая точка
U+
nnnnnnnn
(8 шестнадцатеричных цифр)
|
|
\N{
NAME
}
(since C++23)
|
произвольный символ Unicode |
символ с именем
NAME
(см.
ниже
)
|
-
↑
Условные escape-последовательности являются условно-поддерживаемыми. Символ
cв каждой условной escape-последовательности является членом basic source character set (until C++23) basic character set (since C++23) и не является символом, следующим за\в любой другой escape-последовательности.
Содержание |
Диапазон универсальных символьных имен
|
Если универсальное символьное имя соответствует кодовой точке, которая не является 0x24 (
|
(until C++11) |
|
Если универсальное символьное имя, соответствующее кодовой точке элемента basic source character set или управляющим символам, появляется вне character или string literal , программа является некорректной. Если универсальное символьное имя соответствует суррогатной кодовой точке (диапазон 0xD800-0xDFFF включительно), программа является некорректной. Если универсальное символьное имя, используемое в UTF-16/32 string literal, не соответствует кодовой точке в ISO/IEC 10646 (диапазон 0x0-0x10FFFF включительно), программа является некорректной. |
(since C++11)
(until C++20) |
|
Если универсальное символьное имя, соответствующее кодовой точке элемента basic source character set или управляющим символам, появляется вне character или string literal , программа является некорректной. Если универсальное символьное имя не соответствует кодовой точке в ISO/IEC 10646 (диапазон 0x0-0x10FFFF включительно) или соответствует суррогатной кодовой точке (диапазон 0xD800-0xDFFF включительно), программа является некорректной. |
(since C++20)
(until C++23) |
|
Если универсальное символьное имя, соответствующее скалярному значению символа в basic character set или управляющему символу, появляется вне character или string literal , программа является некорректной. Если универсальное символьное имя не соответствует скалярному значению символа в translation character set , программа является некорректной. |
(since C++23) |
Именованные универсальные символьные escape-последовательности
Универсальное имя символа указанного выше синтаксиса является именованным универсальным символом . Оно обозначает соответствующий символ в стандарте Unicode ( глава 4.8 Name ), если n-char-sequence равен его имени символа или одному из его псевдонимов имени символа типа "control", "correction" или "alternate"; в противном случае программа является некорректной. Эти псевдонимы перечислены в Unicode Character Database в файле NameAliases.txt . Ни одно из этих имен или псевдонимов не имеет начальных или конечных пробелов. Корректная n-char-sequence должна содержать только заглавные латинские буквы от A до Z, цифры, пробел и дефис-минус. Другие символы никогда не встречаются в имени символа Unicode, и поэтому их появление в n-char-sequence всегда делает программу некорректной. |
(начиная с C++23) | |||||||||||||||||||||||||||||
Примечания
\ 0 является наиболее часто используемой восьмеричной escape-последовательностью, поскольку она представляет завершающий нулевой символ в null-terminated strings .
Символ новой строки \n имеет особое значение при использовании в текстовом режиме ввода-вывода : он преобразуется в зависящее от ОС представление новой строки, обычно в байт или последовательность байтов. Некоторые системы отмечают свои строки полями длины вместо этого.
Восьмеричные escape-последовательности имеют ограничение в три восьмеричных цифры, но завершаются при первом символе, который не является допустимой восьмеричной цифрой, если он встретится раньше.
Шестнадцатеричные escape-последовательности не имеют ограничения по длине и завершаются при первом символе, который не является допустимой шестнадцатеричной цифрой. Если значение, представленное одной шестнадцатеричной escape-последовательностью, не соответствует диапазону значений, представленных типом символа, используемым в данном строковом литерале ( char , char8_t , (since C++20) char16_t , char32_t , (since C++11) или wchar_t ), результат не определён.
|
Универсальное символьное имя в узком строковом литерале или 16-битном строковом литерале может отображаться на более чем одну кодовую единицу, например, \U0001f34c составляет 4 char кодовые единицы в UTF-8 ( \xF0\x9F\x8D\x8C ) и 2 char16_t кодовые единицы в UTF-16 ( \xD83C\xDF4C ). |
(since C++11) |
Экранирующая последовательность с вопросительным знаком \ ? используется для предотвращения интерпретации триграфов внутри строковых литералов: строка вида "??/" компилируется как " \" , но если второй вопросительный знак экранирован, как в "? \? /" , она становится "??/" . Поскольку триграфы были удалены из C++, экранирующая последовательность с вопросительным знаком больше не требуется. Она сохранена для совместимости с C++14 (и предыдущими редакциями) и языком C. (начиная с C++17)
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_named_character_escapes
|
202207L
|
(C++23) | Именованные универсальные escape-последовательности символов |
Пример
Вывод:
This is a test She said, "Sells she seashells on the seashore?"
Отчеты о дефектах
Следующие отчеты об изменениях в поведении, содержащие исправления дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| CWG 505 | C++98 |
поведение было неопределенным, если символ после
обратной косой черты не был одним из указанных в таблице |
сделано условно поддерживаемым
(семантика определяется реализацией) |
Смотрите также
|
Документация C
для
Escape-последовательность
|