Пространства имён
Варианты
Действия

Управляющие последовательности

Материал из cppreference.com
< cpp‎ | language
 
 
Язык С++
Общие темы
Ключевые слова
Управляющие последовательности
Управление потоком
Операторы условного выполнения
if
Операторы итерации (циклы)
Операторы перехода
Функции
Объявление функции
Выражение лямбда-функции
Спецификатор inline
Спецификации динамических исключений (до C++17*)
Спецификатор noexcept (C++11)
Исключения
Пространства имён
Типы
Спецификаторы
decltype (C++11)
auto (C++11)
alignas (C++11)
Спецификаторы длительности хранения
Инициализация
Выражения
Альтернативные представления
Литералы
Логические - Целочисленные - С плавающей запятой
Символьные - Строковые - nullptr (C++11)
Определяемые пользователем (C++11)
Утилиты
Атрибуты (C++11)
Types
Объявление typedef
Объявление псевдонима типа (C++11)
Casts
Неявные преобразования - Явные преобразования
static_cast - dynamic_cast
const_cast - reinterpret_cast
Выделение памяти
Классы
Свойства функции класса
explicit (C++11)
static
Специальные функции-элементы
Шаблоны
Разное
 
 

Управляющие последовательности используются для определения специальных символов внутри строковых литералов и символьных литералов.

Определены следующие управляющие последовательности:

Управляющая
последовательность
Описание Представление
Простые 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'' (1~3 восьмеричные цифры)
\o{n...} (начиная с C++23) кодовая единица n... (произвольное количество восьмеричных цифр)
\xn... произвольное шестнадцатеричное значение кодовая единица n... (произвольное количество шестнадцатеричных цифр)
\x{n...} (начиная с C++23)
Условные escape-последовательности[1]
\c Определяется реализацией Определяется реализацией
Универсальные имена символов
\unnnn (начиная с C++11) произвольное значение Юникода;
результатом могут быть несколько кодовых единиц
кодовая точка U+''nnnn'' (4 шестнадцатеричные цифры)
\u{n...} (начиная с C++23) кодовая точка U+n... (произвольное количество шестнадцатеричных цифр)
\Unnnnnnnn (начиная с C++11) кодовая точка U+''nnnnnnnn'' (8 шестнадцатеричных цифр)
\N{ИМЯ} (начиная с C++23) произвольный символ Юникода символ, названный ИМЯ (смотрите ниже)
  1. Условные escape-последовательности поддерживаются условно. Символ c в каждой условной escape-последовательности является элементом базового набора символов, который не является символом, следующим за \ в любой другой escape-последовательности.

Содержание

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

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

(до C++11)

Если универсальное имя символа, соответствующее кодовой точке элемента базового набора символов или управляющие символы появляются вне символьного или строкового литерала, программа имеет неправильный формат.

Если универсальное имя символа, используемое в строковом литерале UTF-16/32, не соответствует кодовой точке в ISO/IEC 10646 (диапазон 0x0-0x10FFFF включительно), программа некорректна.

(начиная с C++11)
(до C++20)

Если универсальное имя символа, соответствующее кодовой точке элемента базового набора символов или управляющие символы появляются вне символьного или строкового литерала, программа имеет неправильный формат.

Если имя универсального символа не соответствует кодовой точке в ISO/IEC 10646 (диапазон 0x0-0x10FFFF включительно) или соответствует суррогатной кодовой точке (диапазон 0xD800-0xDFFF включительно), программа некорректна.

(начиная с C++20)

Именованные универсальные управляющие символы

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

Универсальное имя символа с синтаксисом, описанным выше, является именованным универсальным символом. Он обозначает соответствующий символ в стандарте Юникода (глава 4.8 Имя) если последовательность-n-символов равно его имени символа или одному из его псевдонимов имени символа типа “управление”, “исправление”, или “альтернатива”; иначе программа некорректна.

Эти псевдонимы перечислены в Базах Данных Символов Юникода в NameAliases.txt. Ни одно из этих имён или псевдонимов не имеет начальных или конечных пробелов.

Допустимая последовательность-n-символов должна содержать только заглавные латинские буквы от A до Z, цифры, пробел и дефис-минус. Другие символы никогда не встречаются в имени символа Юникода, поэтому их появление в последовательности-n-символов всегда делает программу неправильной.

(начиная с 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)

Макрос Тестирования функциональности Значение Стандарт Функциональность
__cpp_named_character_escapes 202207L (C++23) Именованные универсальные управляющие символы

[править] Пример

#include <iostream>
 
int main()
{
    std::cout << "Это\nтест\n\n";
    std::printf("Она сказала: \"Чем чаще чищу, тем чашка чище?\"\n");
}

Вывод:

Это
тест
 
Она сказала: "Чем чаще чищу, тем чашка чище?"

[править] Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
CWG 505 C++98 поведение было неопределенным, если символ, следующий за
обратной косой чертой, не был одним из указанных в таблице
поддерживается условно (семантика
определяется реализацией)

[править] Смотрите также

Документация C по Управляющие последовательности