Namespaces
Variants

Escape sequences

From cppreference.net
C++ language
General topics
Keywords
Escape sequences
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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 (см. ниже )
  1. Условные escape-последовательности являются условно-поддерживаемыми. Символ c в каждой условной escape-последовательности является членом basic source character set (until C++23) basic character set (since C++23) и не является символом, следующим за \ в любой другой escape-последовательности.

Содержание

Диапазон универсальных символьных имен

Если универсальное символьное имя соответствует кодовой точке, которая не является 0x24 ( $ ), 0x40 ( @ ) или 0x60 ( ` ) и меньше 0xA0, программа является некорректной. Другими словами, элементы basic source character set и управляющие символы (в диапазонах 0x0-0x1F и 0x7F-0x9F) не могут быть выражены через универсальные символьные имена.

(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-последовательности

\N{ n-char-sequence }
n-char-sequence - один или более n-char символов
n-char - символ из набора символов трансляции , за исключением правой фигурной скобки } или символа новой строки

Универсальное имя символа указанного выше синтаксиса является именованным универсальным символом . Оно обозначает соответствующий символ в стандарте 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-последовательности символов

Пример

#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 Applied to Behavior as published Correct behavior
CWG 505 C++98 поведение было неопределенным, если символ после
обратной косой черты не был одним из указанных в таблице
сделано условно поддерживаемым
(семантика определяется реализацией)

Смотрите также

Документация C для Escape-последовательность