Character constant
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 .
-
un carácter del conjunto básico de caracteres fuente menos comilla simple (
|
(desde C99) |
- c-char-sequence es una secuencia de dos o más c-char s.
|
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) |
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
|