Namespaces
Variants

Character constant

From cppreference.net

Contenidos

Sintaxis

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

donde

  • c-char es cualquiera de los siguientes
  • un carácter del conjunto básico de caracteres fuente menos comilla simple ( ' ), barra invertida ( \ ), o el carácter de nueva línea.
  • secuencia de escape: una de las secuencias de escape de caracteres especiales \ ' \ " \ ? \\ \a \b \f \n \r \t \v , escapes hexadecimales \x... o escapes octales \... como se definen en secuencias de escape .
(desde C99)
  • c-char-sequence es una secuencia de dos o más c-char s.
1) constante de carácter entero de un solo byte, por ejemplo 'a' o ' \n ' o ' \13 ' . Tal constante tiene tipo int y un valor igual a la representación de c-char en el juego de caracteres de ejecución como un valor de tipo char mapeado a int . Si c-char no es representable como un solo byte en el juego de caracteres de ejecución, el valor está definido por la implementación.
2) Constante de carácter UTF-8, por ejemplo u8 'a' . Dicha constante tiene tipo char8_t y el valor igual al valor del punto de código ISO 10646 de c-char , siempre que el valor del punto de código sea representable con una única unidad de código UTF-8 (es decir, c-char está en el rango 0x0-0x7F, inclusive). Si c-char no es representable con una única unidad de código UTF-8, el programa está mal formado.
3) Constante de carácter ancho de 16 bits, por ejemplo u '貓' , pero no u '🍌' ( u ' \U0001f34c ' ). Dicha constante tiene tipo char16_t y un valor igual al valor de c-char en la codificación de 16 bits producida por mbrtoc16 (normalmente UTF-16). Si c-char no es representable o se mapea a más de un carácter de 16 bits, el valor está definido por la implementación.
4) Constante de carácter ancho de 32 bits, por ejemplo U '貓' o U '🍌' . Dicha constante tiene tipo char32_t y un valor igual al valor de c-char en la codificación de 32 bits producida por mbrtoc32 (normalmente UTF-32). Si c-char no es representable o se mapea a más de un carácter de 32 bits, el valor está definido por la implementación.
(hasta C23)
3) Constante de carácter UTF-16, por ejemplo u '貓' , pero no u '🍌' ( u ' \U0001f34c ' ). Dicha constante tiene tipo char16_t y el valor igual al valor del punto de código ISO 10646 de c-char , siempre que el valor del punto de código sea representable con una única unidad de código UTF-16 (es decir, c-char está en el rango 0x0-0xD7FF o 0xE000-0xFFFF, inclusive). Si c-char no es representable con una única unidad de código UTF-16, el programa está mal formado.
4) Constante de carácter UTF-32, por ejemplo U '貓' o U '🍌' . Dicha constante tiene tipo char32_t y el valor igual al valor del punto de código ISO 10646 de c-char , siempre que el valor del punto de código sea representable con una única unidad de código UTF-32 (es decir, c-char está en el rango 0x0-0xD7FF o 0xE000-0x10FFFF, inclusive). Si c-char no es representable con una única unidad de código UTF-32, el programa está mal formado.
(desde C23)
5) constante de carácter ancho, por ejemplo L 'β' o L '貓 . Tal constante tiene tipo wchar_t y un valor igual al valor de c-char en el conjunto de caracteres anchos de ejecución (es decir, el valor que produciría mbtowc ). Si c-char no es representable o se mapea a más de un carácter ancho (por ejemplo, un valor no-BMP en Windows donde wchar_t es de 16 bits), el valor está definido por la implementación.
6) la constante multicarácter, por ejemplo 'AB' , tiene tipo int y valor definido por la implementación.
7) la constante multibyte ancha, por ejemplo L 'AB' , tiene tipo wchar_t y valor definido por la implementación.
8) Constante multibyte de 16 bits, por ejemplo u 'CD' , tiene tipo char16_t y valor definido por la implementación.
9) La constante multibyte de 32 bits, por ejemplo U 'XY' , tiene tipo char32_t y valor definido por la implementación.

Notas

Las constantes multicarácter fueron heredadas por C del lenguaje de programación B. Aunque no están especificadas por el estándar de C, la mayoría de los compiladores (MSVC es una excepción notable) implementan las constantes multicarácter como se especifica en B: los valores de cada char en la constante inicializan bytes sucesivos del entero resultante, en orden big-endian rellenado con ceros y ajustado a la derecha, por ejemplo, el valor de ' \1 ' es 0x00000001 y el valor de ' \1 \2 \3 \4 ' es 0x01020304 .

En C++, los literales de caracteres ordinarios codificables tienen tipo char , en lugar de int .

A diferencia de las constantes enteras , una constante de carácter puede tener un valor negativo si char está firmado: en tales implementaciones ' \xFF ' es un int con el valor - 1 .

Cuando se utiliza en una expresión de control de #if o #elif , las constantes de caracteres pueden interpretarse en términos del conjunto de caracteres de origen, el conjunto de caracteres de ejecución, o algún otro conjunto de caracteres definido por la implementación.

Las constantes multibyte de 16/32 bits no son ampliamente compatibles y se eliminaron en C23. Algunas implementaciones comunes (por ejemplo, clang) no las aceptan en absoluto.

Ejemplo

#include <stddef.h>
#include <stdio.h>
#include <uchar.h>
int main(void)
{
    printf("constant value     \n");
    printf("-------- ----------\n");
    // constantes de caracteres enteros,
    int c1='a'; printf("'a':\t %#010x\n", c1);
    int c2='🍌'; printf("'🍌':\t %#010x\n\n", c2); // definido por la implementación
    // constante multicarácter
    int c3='ab'; printf("'ab':\t %#010x\n\n", c3); // definido por la implementación
    // constantes de caracteres anchos de 16 bits
    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);
    // definido por la implementación (🍌 se mapea a dos caracteres de 16 bits)
    char16_t uc4 = u'🍌'; printf("'🍌':\t %#010x\n\n", (int)uc4);
    // constantes de caracteres anchos de 32 bits
    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);
    // constantes de caracteres anchos
    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);
}

Salida posible:

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

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 6.4.4.5 Constantes de carácter (p: 63-66)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 6.4.4.4 Constantes de carácter (p: 48-50)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 6.4.4.4 Constantes de caracteres (p: 67-70)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 6.4.4.4 Constantes de caracteres (p: 59-61)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 3.1.3.4 Constantes de carácter

Véase también

Documentación de C++ para Literal de carácter