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-Sequenzen werden verwendet, um bestimmte Sonderzeichen in String-Literalen und Zeichenliteralen darzustellen.

Die folgenden Escape-Sequenzen sind verfügbar:

Escape-Sequenz
Beschreibung Darstellung
Einfache Escape-Sequenzen
\' Einfaches Anführungszeichen Byte 0x27 in ASCII-Kodierung
\" Doppeltes Anführungszeichen Byte 0x22 in ASCII-Kodierung
\? Fragezeichen Byte 0x3f in ASCII-Kodierung
\\ Backslash Byte 0x5c in ASCII-Kodierung
\a Hörbarer Signalton Byte 0x07 in ASCII-Kodierung
\b Rückschritt Byte 0x08 in ASCII-Kodierung
\f Seitenvorschub - neue Seite Byte 0x0c in ASCII-Kodierung
\n Zeilenvorschub - neue Zeile Byte 0x0a in ASCII-Kodierung
\r Wagenrücklauf Byte 0x0d in ASCII-Kodierung
\t Horizontaler Tabulator Byte 0x09 in ASCII-Kodierung
\v Vertikaler Tabulator Byte 0x0b in ASCII-Kodierung
Numerische Escape-Sequenzen
\ nnn Beliebiger Oktalwert Codeeinheit nnn (1-3 Oktalziffern)
\o{ n... } (seit C++23) Codeeinheit n... (beliebige Anzahl Oktalziffern)
\x n... Beliebiger Hexadezimalwert Codeeinheit n... (beliebige Anzahl Hexadezimalziffern)
\x{ n... } (seit C++23)
Bedingte Escape-Sequenzen [1]
\ c Implementierungsdefiniert Implementierungsdefiniert
Universelle Zeichennamen
\u nnnn Beliebiger Unicode -Wert;
kann mehrere Codeeinheiten ergeben
Codepunkt U+ nnnn (4 Hexadezimalziffern)
\u{ n... } (seit C++23) Codepunkt U+ n... (beliebige Anzahl Hexadezimalziffern)
\U nnnnnnnn Codepunkt U+ nnnnnnnn (8 Hexadezimalziffern)
\N{ NAME } (seit C++23) Beliebiger Unicode-Zeichen Zeichen mit Namen NAME (siehe unten )
  1. Bedingte Escape-Sequenzen werden bedingt unterstützt. Das Zeichen c in jeder bedingten Escape-Sequenz ist ein Mitglied des basic source character set (bis C++23) basic character set (seit C++23) , das nicht das Zeichen nach dem \ in einer anderen Escape-Sequenz ist.

Inhaltsverzeichnis

Bereich der universellen Zeichennamen

Wenn ein universeller Zeichenname einem Codepunkt entspricht, der nicht 0x24 ( $ ), 0x40 ( @ ) oder 0x60 ( ` ) ist und kleiner als 0xA0, ist das Programm fehlerhaft. Mit anderen Worten, Mitglieder des basic source character set und Steuerzeichen (in den Bereichen 0x0-0x1F und 0x7F-0x9F) können nicht in universellen Zeichennamen ausgedrückt werden.

(bis C++11)

Wenn ein universeller Zeichenname, der einem Codepunkt eines Mitglieds des basic source character set oder einem Steuerzeichen entspricht, außerhalb eines character - oder string literal erscheint, ist das Programm fehlerhaft.

Wenn ein universeller Zeichenname einem Ersatzcodepunkt entspricht (Bereich 0xD800-0xDFFF, inklusive), ist das Programm fehlerhaft.

Wenn ein universeller Zeichenname, der in einem UTF-16/32-Zeichenkettenliteral verwendet wird, nicht einem Codepunkt in ISO/IEC 10646 entspricht (Bereich 0x0-0x10FFFF, inklusive), ist das Programm fehlerhaft.

(seit C++11)
(bis C++20)

Wenn ein universeller Zeichenname, der einem Codepunkt eines Mitglieds des basic source character set oder einem Steuerzeichen entspricht, außerhalb eines character - oder string literal erscheint, ist das Programm fehlerhaft.

Wenn ein universeller Zeichenname nicht einem Codepunkt in ISO/IEC 10646 entspricht (Bereich 0x0-0x10FFFF, inklusive) oder einem Ersatzcodepunkt entspricht (Bereich 0xD800-0xDFFF, inklusive), ist das Programm fehlerhaft.

(seit C++20)
(bis C++23)

Wenn ein universeller Zeichenname, der einem Skalarwert eines Zeichens im basic character set oder einem Steuerzeichen entspricht, außerhalb eines character - oder string literal erscheint, ist das Programm fehlerhaft.

Wenn ein universeller Zeichenname nicht einem Skalarwert eines Zeichens im translation character set entspricht, ist das Programm fehlerhaft.

(seit C++23)


Benannte universelle Zeichenescapes

\N{ n-char-sequence }
n-char-sequence - ein oder mehrere n-char s
n-char - ein Zeichen aus dem Übersetzungszeichensatz , außer der geschweiften Klammer zu } oder dem Zeilenumbruchzeichen

Ein universeller Zeichenname mit der obigen Syntax ist ein benanntes universelles Zeichen . Es bezeichnet das entsprechende Zeichen im Unicode-Standard ( Kapitel 4.8 Name ), wenn die n-char-sequence gleich seinem Zeichennamen oder einem seiner Zeichennamen-Aliase vom Typ "control", "correction" oder "alternate" ist; andernfalls ist das Programm fehlerhaft.

Diese Aliase sind in der Unicode Character Database ’s NameAliases.txt aufgeführt. Keiner dieser Namen oder Aliase hat führende oder nachfolgende Leerzeichen.

Eine gültige n-char-sequence darf nur lateinische Großbuchstaben A bis Z, Ziffern, Leerzeichen und Bindestrich-Minus enthalten. Andere Zeichen kommen niemals in einem Unicode-Zeichennamen vor, und daher macht ihr Erscheinen in einer n-char-sequence das Programm immer fehlerhaft.

(seit C++23)

Hinweise

\ 0 ist die am häufigsten verwendete oktale Escape-Sequenz, da sie das abschließende Nullzeichen in null-terminated strings darstellt.

Das Zeilenumbruchzeichen \n hat eine besondere Bedeutung bei der Verwendung im Textmodus-I/O : Es wird in die betriebssystemspezifische Zeilenumbruchdarstellung umgewandelt, normalerweise ein Byte oder eine Bytefolge. Einige Systeme kennzeichnen ihre Zeilen stattdessen mit Längenfeldern.

Oktale Escape-Sequenzen haben eine Begrenzung von drei Oktalziffern, brechen jedoch am ersten Zeichen ab, das keine gültige Oktalziffer ist, falls dies früher auftritt.

Hexadezimale Escape-Sequenzen haben keine Längenbegrenzung und enden beim ersten Zeichen, das keine gültige hexadezimale Ziffer ist. Wenn der durch eine einzelne hexadezimale Escape-Sequenz dargestellte Wert nicht in den Wertebereich des in diesem Zeichenliteral verwendeten Zeichentyps passt ( char , char8_t , (since C++20) char16_t , char32_t , (since C++11) oder wchar_t ), ist das Ergebnis nicht spezifiziert.

Ein universeller Zeichenname in einem schmalen String-Literal oder einem 16-Bit-String-Literal kann auf mehr als eine Codeeinheit abgebildet werden, z.B. \U0001f34c entspricht 4 char Codeeinheiten in UTF-8 ( \xF0\x9F\x8D\x8C ) und 2 char16_t Codeeinheiten in UTF-16 ( \xD83C\xDF4C ).

(seit C++11)

Die Fragezeichen-Escape-Sequenz \ ? wird verwendet, um zu verhindern, dass Trigraphs innerhalb von String-Literalen interpretiert werden: Ein String wie "??/" wird kompiliert als " \" , aber wenn das zweite Fragezeichen escaped wird, wie in "? \? /" , wird es zu "??/" . Da Trigraphs aus C++ entfernt wurden, ist die Fragezeichen-Escape-Sequenz nicht länger notwendig. Sie wird zur Kompatibilität mit C++14 (und früheren Revisionen) und C beibehalten. (since C++17)

Feature-Test-Makro Wert Std Feature
__cpp_named_character_escapes 202207L (C++23) Benannte universelle Zeichen-Escapes

Beispiel

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

Ausgabe:

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

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
CWG 505 C++98 das Verhalten war undefiniert, wenn das Zeichen nach
einem Backslash nicht eines der in der Tabelle angegebenen war
bedingt unterstützt gemacht
(Semantik ist implementierungsdefiniert)

Siehe auch

C-Dokumentation für Escape-Sequenz