Namespaces
Variants

Character constant

From cppreference.net

Inhaltsverzeichnis

Syntax

' c-char ' (1)
u8' c-char ' (2) (seit C23)
u' c-char ' (3) (seit C11)
U' c-char ' (4) (seit C11)
L' c-char ' (5)
' c-char-sequence ' (6)
L' c-char-sequence ' (7)
u' c-char-sequence ' (8) (seit C11) (entfernt in C23)
U' c-char-sequence ' (9) (seit C11) (entfernt in C23)

wo

  • c-char ist entweder
  • ein Zeichen aus dem grundlegenden Quellzeichensatz ohne einfaches Anführungszeichen ( ' ), Backslash ( \ ) oder das Zeilenumbruchzeichen.
  • Escape-Sequenz: eine der speziellen Zeichen-Escapes \ ' \ " \ ? \\ \a \b \f \n \r \t \v , hexadezimale Escapes \x... oder oktale Escapes \... wie definiert in Escape-Sequenzen .
(seit C99)
  • c-char-sequence ist eine Sequenz von zwei oder mehr c-char s.
1) Einzelbyte-Ganzzahl-Zeichenkonstante, z.B. 'a' oder ' \n ' oder ' \13 ' . Eine solche Konstante hat den Typ int und einen Wert, der der Darstellung von c-char im Ausführungszeichensatz als Wert vom Typ char abgebildet auf int entspricht. Wenn c-char nicht als einzelnes Byte im Ausführungszeichensatz darstellbar ist, ist der Wert implementierungsdefiniert.
2) UTF-8-Zeichenkonstante, z.B. u8 'a' . Eine solche Konstante hat den Typ char8_t und den Wert gleich dem ISO 10646-Codepunktwert von c-char , vorausgesetzt, dass der Codepunktwert mit einer einzelnen UTF-8-Codeeinheit darstellbar ist (d.h. c-char liegt im Bereich 0x0-0x7F, inklusive). Wenn c-char nicht mit einer einzelnen UTF-8-Codeeinheit darstellbar ist, ist das Programm fehlerhaft.
3) 16-Bit-Breiten-Zeichenkonstante, z.B. u '貓' , aber nicht u '🍌' ( u ' \U0001f34c ' ). Solche Konstanten haben den Typ char16_t und einen Wert, der dem Wert von c-char in der 16-Bit-Codierung entspricht, die durch mbrtoc16 erzeugt wird (normalerweise UTF-16). Wenn c-char nicht darstellbar ist oder auf mehr als ein 16-Bit-Zeichen abgebildet wird, ist der Wert implementierungsdefiniert.
4) 32-Bit-Breiten-Zeichenkonstante, z.B. U '貓' oder U '🍌' . Solche Konstanten haben den Typ char32_t und einen Wert, der dem Wert von c-char in der 32-Bit-Codierung entspricht, die durch mbrtoc32 erzeugt wird (normalerweise UTF-32). Wenn c-char nicht darstellbar ist oder auf mehr als ein 32-Bit-Zeichen abgebildet wird, ist der Wert implementierungsdefiniert.
(bis C23)
3) UTF-16-Zeichenkonstante, z.B. u '貓' , aber nicht u '🍌' ( u ' \U0001f34c ' ). Solche Konstanten haben den Typ char16_t und den Wert des ISO-10646-Codepunktwerts von c-char , vorausgesetzt, dass der Codepunktwert mit einer einzelnen UTF-16-Codeeinheit darstellbar ist (d.h. c-char liegt im Bereich 0x0-0xD7FF oder 0xE000-0xFFFF, einschließlich). Wenn c-char nicht mit einer einzelnen UTF-16-Codeeinheit darstellbar ist, ist das Programm fehlerhaft.
4) UTF-32-Zeichenkonstante, z.B. U '貓' oder U '🍌' . Solche Konstanten haben den Typ char32_t und den Wert des ISO-10646-Codepunktwerts von c-char , vorausgesetzt, dass der Codepunktwert mit einer einzelnen UTF-32-Codeeinheit darstellbar ist (d.h. c-char liegt im Bereich 0x0-0xD7FF oder 0xE000-0x10FFFF, einschließlich). Wenn c-char nicht mit einer einzelnen UTF-32-Codeeinheit darstellbar ist, ist das Programm fehlerhaft.
(seit C23)
5) Breitzeichenkonstante, z.B. L 'β' oder L '貓 . Eine solche Konstante hat den Typ wchar_t und einen Wert, der dem Wert von c-char im ausgeführten Breitzeichenzeichensatz entspricht (d.h. der Wert, der durch mbtowc erzeugt würde). Wenn c-char nicht darstellbar ist oder auf mehr als ein Breitzeichen abgebildet wird (z.B. ein Nicht-BMP-Wert unter Windows, wo wchar_t 16-Bit ist), ist der Wert implementierungsdefiniert.
6) Mehrzeichenkonstante, z.B. 'AB' , hat den Typ int und einen implementierungsdefinierten Wert.
7) breite Multicharakter-Konstante, z.B. L 'AB' , hat den Typ wchar_t und einen implementierungsdefinierten Wert.
8) 16-Bit-Multicharakter-Konstante, z.B. u 'CD' , hat den Typ char16_t und einen implementierungsdefinierten Wert.
9) 32-Bit-Multicharakter-Konstante, z.B. U 'XY' , hat den Typ char32_t und einen implementierungsdefinierten Wert.

Hinweise

Mehrzeichenkonstanten wurden von C aus der Programmiersprache B übernommen. Obwohl nicht im C-Standard spezifiziert, implementieren die meisten Compiler (MSVC ist eine bemerkenswerte Ausnahme) Mehrzeichenkonstanten wie in B festgelegt: Die Werte jedes Zeichens in der Konstante initialisieren aufeinanderfolgende Bytes des resultierenden Integer-Werts in Big-Endian-Reihenfolge, rechtsbündig mit Nullauffüllung, z.B. ist der Wert von ' \1 ' gleich 0x00000001 und der Wert von ' \1 \2 \3 \4 ' gleich 0x01020304 .

In C++ haben kodierbare gewöhnliche Zeichenliterale den Typ char , und nicht int .

Im Gegensatz zu Integer-Konstanten kann eine Zeichenkonstante einen negativen Wert haben, wenn char signed ist: auf solchen Implementierungen hat ' \xFF ' den Typ int mit dem Wert - 1 .

Wenn sie in einem kontrollierenden Ausdruck von #if oder #elif verwendet werden, können Zeichenkonstanten in Bezug auf den Quellzeichensatz, den Ausführungszeichensatz oder einen anderen implementierungsdefinierten Zeichensatz interpretiert werden.

16/32-Bit Multicharacter-Konstanten werden nicht weitgehend unterstützt und in C23 entfernt. Einige gängige Implementierungen (z.B. clang) akzeptieren sie überhaupt nicht.

Beispiel

#include <stddef.h>
#include <stdio.h>
#include <uchar.h>
int main(void)
{
    printf("Konstantenwert     \n");
    printf("-------- ----------\n");
    // Ganzzahl-Zeichenkonstanten,
    int c1='a'; printf("'a':\t %#010x\n", c1);
    int c2='🍌'; printf("'🍌':\t %#010x\n\n", c2); // implementationsdefiniert
    // Mehrzeichenkonstante
    int c3='ab'; printf("'ab':\t %#010x\n\n", c3); // implementationsdefiniert
    // 16-Bit Breitzeichenkonstanten
    char16_t uc1 = u'a'; printf("'a':\t %#010x\n", (int)uc1);
    char16_t uc2 = u'¢'; printf("'¢':\t %#010x\n", (int)uc2);
    char16_t uc3 = u'猫'; printf("'猫':\t %#010x\n", (int)uc3);
    // implementationsdefiniert (🍌 wird auf zwei 16-Bit Zeichen abgebildet)
    char16_t uc4 = u'🍌'; printf("'🍌':\t %#010x\n\n", (int)uc4);
    // 32-Bit Breitzeichenkonstanten
    char32_t Uc1 = U'a'; printf("'a':\t %#010x\n", (int)Uc1);
    char32_t Uc2 = U'¢'; printf("'¢':\t %#010x\n", (int)Uc2);
    char32_t Uc3 = U'猫'; printf("'猫':\t %#010x\n", (int)Uc3);
    char32_t Uc4 = U'🍌'; printf("'🍌':\t %#010x\n\n", (int)Uc4);
    // Breitzeichenkonstanten
    wchar_t wc1 = L'a'; printf("'a':\t %#010x\n", (int)wc1);
    wchar_t wc2 = L'¢'; printf("'¢':\t %#010x\n", (int)wc2);
    wchar_t wc3 = L'猫'; printf("'猫':\t %#010x\n", (int)wc3);
    wchar_t wc4 = L'🍌'; printf("'🍌':\t %#010x\n\n", (int)wc4);
}

Mögliche Ausgabe:

Konstantenwert     
-------- ----------
'a':	 0x00000061
'🍌':	 0xf09f8d8c
'ab':	 0x00006162
'a':	 0x00000061
'¢':	 0x000000a2
'猫':	 0x0000732b
'🍌':	 0x0000df4c
'a':	 0x00000061
'¢':	 0x000000a2
'猫':	 0x0000732b
'🍌':	 0x0001f34c
'a':	 0x00000061
'¢':	 0x000000a2
'猫':	 0x0000732b
'🍌':	 0x0001f34c

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 6.4.4.5 Zeichenkonstanten (S: 63-66)
  • C17-Standard (ISO/IEC 9899:2018):
  • 6.4.4.4 Zeichenkonstanten (S: 48-50)
  • C11-Standard (ISO/IEC 9899:2011):
  • 6.4.4.4 Zeichenkonstanten (S: 67-70)
  • C99-Standard (ISO/IEC 9899:1999):
  • 6.4.4.4 Zeichenkonstanten (S: 59-61)
  • C89/C90 Standard (ISO/IEC 9899:1990):
  • 3.1.3.4 Zeichenkonstanten

Siehe auch

C++ Dokumentation für Character literal