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

Las secuencias de escape se utilizan para representar ciertos caracteres especiales dentro de string literals y character literals .

Las siguientes secuencias de escape están disponibles:

Secuencia de
escape
Descripción Representación
Secuencias de escape simples
\' comilla simple byte 0x27 en codificación ASCII
\" comilla doble byte 0x22 en codificación ASCII
\? signo de interrogación byte 0x3f en codificación ASCII
\\ barra invertida byte 0x5c en codificación ASCII
\a campana audible byte 0x07 en codificación ASCII
\b retroceso byte 0x08 en codificación ASCII
\f alimentación de formulario - nueva página byte 0x0c en codificación ASCII
\n alimentación de línea - nueva línea byte 0x0a en codificación ASCII
\r retorno de carro byte 0x0d en codificación ASCII
\t tabulación horizontal byte 0x09 en codificación ASCII
\v tabulación vertical byte 0x0b en codificación ASCII
Secuencias de escape numéricas
\ nnn valor octal arbitrario unidad de código nnn (1~3 dígitos octales)
\o{ n... } (desde C++23) unidad de código n... (número arbitrario de dígitos octales)
\x n... valor hexadecimal arbitrario unidad de código n... (número arbitrario de dígitos hexadecimales)
\x{ n... } (desde C++23)
Secuencias de escape condicionales [1]
\ c Definido por la implementación Definido por la implementación
Nombres de caracteres universales
\u nnnn valor Unicode arbitrario;
puede resultar en varias unidades de código
punto de código U+ nnnn (4 dígitos hexadecimales)
\u{ n... } (desde C++23) punto de código U+ n... (número arbitrario de dígitos hexadecimales)
\U nnnnnnnn punto de código U+ nnnnnnnn (8 dígitos hexadecimales)
\N{ NAME } (desde C++23) carácter Unicode arbitrario carácter nombrado por NAME (ver abajo )
  1. Las secuencias de escape condicionales son soportadas condicionalmente. El carácter c en cada secuencia de escape condicional es un miembro del basic source character set (until C++23) basic character set (since C++23) que no es el carácter que sigue a la \ en cualquier otra secuencia de escape.

Contenidos

Rango de nombres de caracteres universales

Si un nombre de carácter universal corresponde a un punto de código que no es 0x24 ( $ ), 0x40 ( @ ), ni 0x60 ( ` ) y es menor que 0xA0, el programa está mal formado. En otras palabras, los miembros del conjunto básico de caracteres fuente y los caracteres de control (en los rangos 0x0-0x1F y 0x7F-0x9F) no pueden expresarse mediante nombres de caracteres universales.

(hasta C++11)

Si un nombre de carácter universal correspondiente a un punto de código de un miembro del conjunto básico de caracteres fuente o caracteres de control aparece fuera de un literal de carácter o literal de cadena , el programa está mal formado.

Si un nombre de carácter universal corresponde a un punto de código sustituto (el rango 0xD800-0xDFFF, inclusive), el programa está mal formado.

Si un nombre de carácter universal utilizado en un literal de cadena UTF-16/32 no corresponde a un punto de código en ISO/IEC 10646 (el rango 0x0-0x10FFFF, inclusive), el programa está mal formado.

(desde C++11)
(hasta C++20)

Si un nombre de carácter universal correspondiente a un punto de código de un miembro del conjunto básico de caracteres fuente o caracteres de control aparece fuera de un literal de carácter o literal de cadena , el programa está mal formado.

Si un nombre de carácter universal no corresponde a un punto de código en ISO/IEC 10646 (el rango 0x0-0x10FFFF, inclusive) o corresponde a un punto de código sustituto (el rango 0xD800-0xDFFF, inclusive), el programa está mal formado.

(desde C++20)
(hasta C++23)

Si un nombre de carácter universal correspondiente a un valor escalar de un carácter en el conjunto básico de caracteres o un carácter de control aparece fuera de un literal de carácter o literal de cadena , el programa está mal formado.

Si un nombre de carácter universal no corresponde a un valor escalar de un carácter en el conjunto de caracteres de traducción , el programa está mal formado.

(desde C++23)


Secuencias de escape de caracteres universales con nombre

\N{ n-char-sequence }
n-char-sequence - uno o más n-char s
n-char - un carácter del juego de caracteres de traducción , excepto la llave derecha } o el carácter de nueva línea

Un nombre de carácter universal de la sintaxis anterior es un carácter universal con nombre . Designa el carácter correspondiente en el Estándar Unicode ( capítulo 4.8 Nombre ) si la n-char-sequence es igual a su nombre de carácter o a uno de sus alias de nombre de carácter de tipo "control", "corrección" o "alternativo"; de lo contrario, el programa está mal formado.

Estos alias se enumeran en la Base de Datos de Caracteres Unicode , en el archivo NameAliases.txt . Ninguno de estos nombres o alias tiene espacios iniciales o finales.

Una n-char-sequence válida debe contener únicamente letras latinas mayúsculas de la A a la Z, dígitos, espacios y guiones. Otros caracteres nunca aparecen en un nombre de carácter Unicode, y por lo tanto su aparición en una n-char-sequence siempre hace que el programa esté mal formado.

(desde C++23)

Notas

\ 0 es la secuencia de escape octal más comúnmente utilizada, porque representa el carácter nulo de terminación en cadenas terminadas en nulo .

El carácter de nueva línea \n tiene un significado especial cuando se utiliza en E/S en modo texto : se convierte a la representación de nueva línea específica del SO, generalmente un byte o secuencia de bytes. Algunos sistemas marcan sus líneas con campos de longitud en su lugar.

Las secuencias de escape octales tienen un límite de tres dígitos octales, pero terminan en el primer carácter que no sea un dígito octal válido si se encuentra antes.

Las secuencias de escape hexadecimales no tienen límite de longitud y terminan en el primer carácter que no sea un dígito hexadecimal válido. Si el valor representado por una única secuencia de escape hexadecimal no cabe en el rango de valores representado por el tipo de carácter utilizado en este literal de cadena ( char , char8_t , (since C++20) char16_t , char32_t , (since C++11) o wchar_t ), el resultado no está especificado.

Un nombre de carácter universal en un literal de cadena estrecha o un literal de cadena de 16 bits puede mapearse a más de una unidad de código, por ejemplo \U0001f34c son 4 unidades de código de char en UTF-8 ( \xF0\x9F\x8D\x8C ) y 2 unidades de código de char16_t en UTF-16 ( \xD83C\xDF4C ).

(desde C++11)

La secuencia de escape del signo de interrogación \ ? se utiliza para evitar que los trigraphs sean interpretados dentro de literales de cadena: una cadena como "??/" se compila como " \" , pero si el segundo signo de interrogación se escapa, como en "? \? /" , se convierte en "??/" . Dado que los trigraphs han sido eliminados de C++, la secuencia de escape del signo de interrogación ya no es necesaria. Se conserva para compatibilidad con C++14 (y revisiones anteriores) y C. (since C++17)

Macro de prueba de características Valor Std Característica
__cpp_named_character_escapes 202207L (C++23) Secuencias de escape de caracteres universales con nombre

Ejemplo

#include <iostream>
int main()
{
    std::cout << "This\nis\na\ntest\n\n";
    std::cout << "She said, \"Sells she seashells on the seashore?\"\n";
}

Salida:

This
is
a
test
She said, "Sells she seashells on the seashore?"

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
CWG 505 C++98 el comportamiento era indefinido si el carácter siguiente
a una barra invertida no era uno de los especificados en la tabla
hecho condicionalmente soportado
(la semántica está definida por la implementación)

Véase también

Documentación de C para Secuencia de escape