Namensräume
Varianten
Aktionen

Zeichenliteral

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

Inhalt

[bearbeiten] Syntax

'c-char ' (1)
u8'c-char ' (2) (seit C++17)
u'c-char ' (3) (seit C++11)
U'c-char ' (4) (seit C++11)
L'c-char ' (5)
'c-char-sequence ' (6)
L'c-char-sequence ' (7) (bis C++23)
c-char - entweder
basic-c-char - Ein Zeichen aus dem grundlegenden Quellzeichen-Set(bis C++23)Übersetzungszeichen-Set(seit C++23), außer dem einfachen Anführungszeichen ', dem Backslash \ oder dem Zeilenumbruchzeichen
c-char-sequence - zwei oder mehr c-chars

[bearbeiten] Erklärung

1) Einfaches Zeichenliteral, z.B. 'a' oder '\n' oder '\13'. Ein solches Literal hat den Typ char und den Wert, der der Darstellung von c-char im Ausführungszeichen-Set(bis C++23)entsprechenden Codepunkt aus der gewöhnlichen Literal-Kodierung(seit C++23) entspricht.
2) UTF-8-Zeichenliteral, z.B. u8'a'. Ein solches Literal hat den Typ char(bis C++20)char8_t(seit C++20) und den Wert, der dem ISO/IEC 10646-Codepunktwert von c-char entspricht, vorausgesetzt, der Codepunktwert ist mit einer einzigen UTF-8-Codeeinheit darstellbar (d. h. c-char liegt im Bereich 0x0-0x7F, einschließlich).
3) UTF-16-Zeichenliteral, z.B. u'猫', aber nicht u'🍌' (u'\U0001f34c'). Ein solches Literal hat den Typ char16_t und den Wert, der dem ISO/IEC 10646-Codepunktwert von c-char entspricht, vorausgesetzt, der Codepunktwert ist mit einer einzigen UTF-16-Codeeinheit darstellbar (d. h. c-char liegt im Bereich 0x0-0xFFFF, einschließlich).
4) UTF-32-Zeichenliteral, z.B. U'猫' oder U'🍌'. Ein solches Literal hat den Typ char32_t und den Wert, der dem ISO/IEC 10646-Codepunktwert von c-char entspricht.
5) Weites Zeichenliteral, z.B. L'β' oder L'猫'. Ein solches Literal hat den Typ wchar_t und den Wert, der dem Wert von c-char im weiten Ausführungszeichen-Set(bis C++23)entsprechenden Codepunkt aus der weiten Literal-Kodierung(seit C++23) entspricht.
6) Einfaches Mehrzeichenliteral(bis C++23)Mehrzeichenliteral(seit C++23), z.B. 'AB', ist bedingt unterstützt, hat den Typ int und einen implementierungsdefinierten Wert.
7) Weites Mehrzeichenliteral, z.B. L'AB', ist bedingt unterstützt, hat den Typ wchar_t und einen implementierungsdefinierten Wert.

[bearbeiten] Nicht kodierbare Zeichen

1-5) Wenn c-char keine numerische Escape-Sequenz (siehe unten) ist und c-char nicht in der zugehörigen Zeichenkodierung des Literals darstellbar ist oder nicht als einzelne Codeeinheit in dieser Kodierung kodiert werden kann (z. B. ein Nicht-BMP-Wert unter Windows, wo wchar_t 16 Bit hat), ist das Programm schlecht formatiert.
6) Wenn irgendein c-char in c-char-sequence nicht als einzelne Codeeinheit in der gewöhnlichen Literal-Kodierung kodiert werden kann, ist das Programm schlecht formatiert.
7) Wenn irgendein c-char in c-char-sequence nicht als einzelne Codeeinheit in der weiten Literal-Kodierung kodiert werden kann, ist das Programm schlecht formatiert.
(bis C++23)

[bearbeiten] Numerische Escape-Sequenzen

Numerische (oktale und hexadezimale) Escape-Sequenzen können zur Angabe des Zeichens verwendet werden.

Wenn das Zeichenliteral nur eine numerische Escape-Sequenz enthält und der durch die Escape-Sequenz angegebene Wert durch die vorzeichenlose Version seines Typs darstellbar ist, hat das Zeichenliteral den gleichen Wert wie der angegebene Wert (möglicherweise nach Konvertierung in den Zeichentyp).

Ein UTF-N-Zeichenliteral kann jeden Wert haben, der von seinem Typ darstellbar ist. Wenn der Wert keinem gültigen Unicode-Codepunkt entspricht oder sein entsprechender Codepunkt nicht als einzelne Codeeinheit in UTF-N darstellbar ist, kann er dennoch durch eine numerische Escape-Sequenz mit diesem Wert angegeben werden. Z.B. ist u8'\xff' wohlformatiert und gleich char8_t(0xFF).

(seit C++23)


Wenn der durch eine numerische Escape-Sequenz in einem einfachen oder weiten Zeichenliteral angegebene Wert nicht durch char bzw. wchar_t darstellbar ist, ist der Wert des Zeichenliterals implementierungsdefiniert.

(bis C++23)

Wenn der durch eine numerische Escape-Sequenz in einem einfachen oder weiten Zeichenliteral mit einem c-char angegebene Wert durch die vorzeichenlose Version des zugrunde liegenden Typs von char bzw. wchar_t darstellbar ist, ist der Wert des Literals der ganzzahlige Wert dieses vorzeichenlosen Ganzzahltyps, konvertiert in den Typ des Literals. Andernfalls ist das Programm schlecht formatiert.

(seit C++23)


Wenn der durch eine numerische Escape-Sequenz in einem UTF-N-Zeichenliteral angegebene Wert nicht durch den entsprechenden charN_t darstellbar ist, ist der Wert des Zeichenliterals implementierungsdefiniert(bis C++17)das Programm schlecht formatiert(seit C++17).

(seit C++11)

[bearbeiten] Anmerkungen

Mehrzeichenliterale wurden von C aus der B-Programmiersprache übernommen. Obwohl weder im C- noch im C++-Standard spezifiziert, implementieren die meisten Compiler (MSVC ist eine bemerkenswerte Ausnahme) Mehrzeichenliterale wie in B spezifiziert: Die Werte jedes Zeichens im Literal initialisieren aufeinanderfolgende Bytes des resultierenden Integers in Big-Endian-Null-Padding, rechtsbündig angeordnet. Z.B. ist der Wert von '\1' 0x00000001 und der Wert von '\1\2\3\4' ist 0x01020304.

In C haben Zeichenkonstanten wie 'a' oder '\n' den Typ int anstelle von char.

[bearbeiten] Beispiel

#include <cstdint>
#include <iomanip>
#include <iostream>
#include <string_view>
 
template<typename CharT>
void dump(std::string_view s, const CharT c)
{
    const uint8_t* data{reinterpret_cast<const uint8_t*>(&c)};
 
    std::cout << s << " \t" << std::hex
              << std::uppercase << std::setfill('0');
 
    for (auto i{0U}; i != sizeof(CharT); ++i)
        std::cout << std::setw(2) << static_cast<unsigned>(data[i]) << ' ';
 
    std::cout << '\n';
}
 
void print(std::string_view str = "") { std::cout << str << '\n'; }
 
int main()
{
    print("Ordinary character literals:");
    char c1 = 'a'; dump("'a'", c1);
    char c2 = '\x2a'; dump("'*'", c2);
 
    print("\n" "Ordinary multi-character literals:");
    int mc1 = 'ab'; dump("'ab'", mc1);       // implementation-defined
    int mc2 = 'abc'; dump("'abc'", mc2);     // implementation-defined
 
    print("\n" "UTF-8 character literals:");
    char8_t C1 = u8'a'; dump("u8'a'", C1);
//  char8_t C2 = u8'¢'; dump("u8'¢'", C2);   // error: ¢ maps to two UTF-8 code units
//  char8_t C3 = u8'猫'; dump("u8'猫'", C3); // error: 猫 maps to three UTF-8 code units
//  char8_t C4 = u8'🍌'; dump("u8'🍌'", C4); // error: 🍌 maps to four UTF-8 code units
 
    print("\n" "UTF-16 character literals:");
    char16_t uc1 = u'a'; dump("u'a'", uc1);
    char16_t uc2 = u'¢'; dump("u'¢'", uc2);
    char16_t uc3 = u'猫'; dump("u'猫'", uc3);
//  char16_t uc4 = u'🍌'; dump("u'🍌'", uc4); // error: 🍌 maps to two UTF-16 code units
 
    print("\n" "UTF-32 character literals:");
    char32_t Uc1 = U'a'; dump("U'a'", Uc1);
    char32_t Uc2 = U'¢'; dump("U'¢'", Uc2);
    char32_t Uc3 = U'猫'; dump("U'猫'", Uc3);
    char32_t Uc4 = U'🍌'; dump("U'🍌'", Uc4);
 
    print("\n" "Wide character literals:");
    wchar_t wc1 = L'a'; dump("L'a'", wc1);
    wchar_t wc2 = L'¢'; dump("L'¢'", wc2);
    wchar_t wc3 = L'猫'; dump("L'猫'", wc3);
    wchar_t wc4 = L'🍌'; dump("L'🍌'", wc4);  // unsupported on Windows since C++23
}

Mögliche Ausgabe

Ordinary character literals:
'a' 	61 
'*' 	2A 
 
Ordinary multi-character literals:
'ab' 	62 61 00 00 
'abc' 	63 62 61 00 
 
UTF-8 character literals:
u8'a' 	61 
 
UTF-16 character literals:
u'a' 	61 00 
u'¢' 	A2 00 
u'猫' 	2B 73 
 
UTF-32 character literals:
U'a' 	61 00 00 00 
U'¢' 	A2 00 00 00 
U'猫' 	2B 73 00 00 
U'🍌' 	4C F3 01 00 
 
Wide character literals:
L'a' 	61 00 00 00 
L'¢' 	A2 00 00 00 
L'猫' 	2B 73 00 00 
L'🍌' 	4C F3 01 00

[bearbeiten] 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 912 C++98 Nicht kodierbares einfaches Zeichenliteral war nicht spezifiziert spezifiziert als bedingt unterstützt
CWG 1024 C++98 Mehrzeichenliteral musste unterstützt werden Wurde bedingt unterstützt gemacht
CWG 1656 C++98 die Bedeutung der numerischen Escape-Sequenz
in einem Zeichenliteral war unklar
spezifiziert
P1854R4 C++98 nicht kodierbare Zeichenliterale waren bedingt unterstützt das Programm ist schlecht formatiert

[bearbeiten] Referenzen

  • C++23 Standard (ISO/IEC 14882:2024)
  • 5.13.3 Zeichenliterale [lex.ccon]
  • C++20 Standard (ISO/IEC 14882:2020)
  • 5.13.3 Zeichenliterale [lex.ccon]
  • C++17 Standard (ISO/IEC 14882:2017)
  • 5.13.3 Zeichenliterale [lex.ccon]
  • C++14 Standard (ISO/IEC 14882:2014)
  • 2.14.3 Zeichenliterale [lex.ccon]
  • C++11 Standard (ISO/IEC 14882:2011)
  • 2.14.3 Zeichenliterale [lex.ccon]
  • C++03-Standard (ISO/IEC 14882:2003)
  • 2.13.2 Zeichenliterale [lex.ccon]
  • C++98 Standard (ISO/IEC 14882:1998)
  • 2.13.2 Zeichenliterale [lex.ccon]

[bearbeiten] Siehe auch

benutzerdefinierte Literale(C++11) Literale mit benutzerdefiniertem Suffix[bearbeiten]
C-Dokumentation für Zeichenkonstante