Character constant
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 .
-
ein Zeichen aus dem grundlegenden Quellzeichensatz ohne einfaches Anführungszeichen (
|
(seit C99) |
- c-char-sequence ist eine Sequenz von zwei oder mehr c-char s.
|
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) |
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
|