Namespaces
Variants

Character constant

From cppreference.net

Table des matières

Syntaxe

' c-char ' (1)
u8' c-char ' (2) (depuis C23)
u' c-char ' (3) (depuis C11)
U' c-char ' (4) (depuis C11)
L' c-char ' (5)
' c-char-sequence ' (6)
L' c-char-sequence ' (7)
u' c-char-sequence ' (8) (depuis C11) (supprimé en C23)
U' c-char-sequence ' (9) (depuis C11) (supprimé en C23)

  • c-char est soit
  • un caractère de l'ensemble de caractères source de base, à l'exclusion de l'apostrophe ( ' ), de la barre oblique inverse ( \ ) ou du caractère de nouvelle ligne.
  • séquence d'échappement : l'un des caractères spéciaux d'échappement \ ' \ " \ ? \\ \a \b \f \n \r \t \v , les échappements hexadécimaux \x... ou les échappements octaux \... tels que définis dans les séquences d'échappement .
(depuis C99)
  • c-char-sequence est une séquence de deux ou plusieurs c-char s.
1) constante de caractère entier sur un octet, par ex. 'a' ou ' \n ' ou ' \13 ' . Une telle constante a le type int et une valeur égale à la représentation de c-char dans le jeu de caractères d'exécution en tant que valeur de type char convertie en int . Si c-char n'est pas représentable sur un seul octet dans le jeu de caractères d'exécution, la valeur est définie par l'implémentation.
2) Constante de caractère UTF-8, par ex. u8 'a' . Une telle constante a le type char8_t et la valeur égale à la valeur du point de code ISO 10646 de c-char , à condition que la valeur du point de code soit représentable avec une seule unité de code UTF-8 (c'est-à-dire que c-char soit dans la plage 0x0-0x7F, inclus). Si c-char n'est pas représentable avec une seule unité de code UTF-8, le programme est mal formé.
3) Constante de caractère large 16 bits, par ex. u '貓' , mais pas u '🍌' ( u ' \U0001f34c ' ). Cette constante a le type char16_t et une valeur égale à la valeur de c-char dans l'encodage 16 bits produit par mbrtoc16 (normalement UTF-16). Si c-char n'est pas représentable ou correspond à plus d'un caractère 16 bits, la valeur est définie par l'implémentation.
4) Constante de caractère large 32 bits, par ex. U '貓' ou U '🍌' . Cette constante a le type char32_t et une valeur égale à la valeur de c-char dans l'encodage 32 bits produit par mbrtoc32 (normalement UTF-32). Si c-char n'est pas représentable ou correspond à plus d'un caractère 32 bits, la valeur est définie par l'implémentation.
(jusqu'en C23)
3) Constante de caractère UTF-16, par ex. u '貓' , mais pas u '🍌' ( u ' \U0001f34c ' ). Cette constante a le type char16_t et la valeur égale au point de code ISO 10646 de c-char , à condition que la valeur du point de code soit représentable avec une seule unité de code UTF-16 (c'est-à-dire que c-char soit dans la plage 0x0-0xD7FF ou 0xE000-0xFFFF, inclus). Si c-char n'est pas représentable avec une seule unité de code UTF-16, le programme est mal formé.
4) Constante de caractère UTF-32, par ex. U '貓' ou U '🍌' . Cette constante a le type char32_t et la valeur égale au point de code ISO 10646 de c-char , à condition que la valeur du point de code soit représentable avec une seule unité de code UTF-32 (c'est-à-dire que c-char soit dans la plage 0x0-0xD7FF ou 0xE000-0x10FFFF, inclus). Si c-char n'est pas représentable avec une seule unité de code UTF-32, le programme est mal formé.
(depuis C23)
5) constante de caractère large, par exemple L 'β' ou L '貓 . Une telle constante a le type wchar_t et une valeur égale à la valeur de c-char dans le jeu de caractères large d'exécution (c'est-à-dire la valeur qui serait produite par mbtowc ). Si c-char n'est pas représentable ou correspond à plus d'un caractère large (par exemple une valeur non-BMP sur Windows où wchar_t est 16-bit), la valeur est définie par l'implémentation.
6) une constante multi-caractères, par exemple 'AB' , a le type int et une valeur définie par l'implémentation.
7) la constante multicaractère large, par exemple L 'AB' , a le type wchar_t et une valeur définie par l'implémentation.
8) Constante multicaractère 16 bits, par exemple u 'CD' , a le type char16_t et une valeur définie par l'implémentation.
9) La constante multicaractère 32 bits, par exemple U 'XY' , a le type char32_t et une valeur définie par l'implémentation.

Notes

Les constantes multi-caractères ont été héritées par le langage C à partir du langage de programmation B. Bien que non spécifiées par la norme C, la plupart des compilateurs (MSVC est une exception notable) implémentent les constantes multi-caractères comme spécifié dans B : les valeurs de chaque caractère dans la constante initialisent les octets successifs de l'entier résultant, dans l'ordre big-endian complété par des zéros et aligné à droite, par exemple la valeur de ' \1 ' est 0x00000001 et la valeur de ' \1 \2 \3 \4 ' est 0x01020304 .

En C++, les littéraux de caractères ordinaires encodables ont le type char , plutôt que int .

Contrairement aux constantes entières , une constante de caractère peut avoir une valeur négative si char est signé : sur de telles implémentations ' \xFF ' est un int avec la valeur - 1 .

Lorsqu'ils sont utilisés dans une expression de contrôle de #if ou #elif , les constantes de caractères peuvent être interprétées en fonction du jeu de caractères source, du jeu de caractères d'exécution, ou d'un autre jeu de caractères défini par l'implémentation.

Les constantes multi-caractères 16/32 bits ne sont pas largement supportées et ont été supprimées dans C23. Certaines implémentations courantes (par exemple clang) ne les acceptent pas du tout.

Exemple

#include <stddef.h>
#include <stdio.h>
#include <uchar.h>
int main(void)
{
    printf("constant value     \n");
    printf("-------- ----------\n");
    // integer character constants,
    int c1='a'; printf("'a':\t %#010x\n", c1);
    int c2='🍌'; printf("'🍌':\t %#010x\n\n", c2); // implementation-defined
    // multicharacter constant
    int c3='ab'; printf("'ab':\t %#010x\n\n", c3); // implementation-defined
    // 16-bit wide character constants
    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);
    // implementation-defined (🍌 maps to two 16-bit characters)
    char16_t uc4 = u'🍌'; printf("'🍌':\t %#010x\n\n", (int)uc4);
    // 32-bit wide character constants
    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);
    // wide character constants
    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);
}

Sortie possible :

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

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 6.4.4.5 Constantes de caractères (p : 63-66)
  • Norme C17 (ISO/CEI 9899:2018):
  • 6.4.4.4 Constantes de caractères (p: 48-50)
  • Norme C11 (ISO/IEC 9899:2011):
  • 6.4.4.4 Constantes de caractère (p: 67-70)
  • Norme C99 (ISO/IEC 9899:1999) :
  • 6.4.4.4 Constantes de caractères (p: 59-61)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 3.1.3.4 Constantes de caractères

Voir aussi

Documentation C++ pour Littéral de caractère