Namespaces
Variants

Character constant

From cppreference.net

Содержание

Синтаксис

' c-char ' (1)
u8' c-char ' (2) (начиная с C23)
u' c-char ' (3) (начиная с C11)
U' c-char ' (4) (начиная с C11)
L' c-char ' (5)
' c-char-sequence ' (6)
L' c-char-sequence ' (7)
u' c-char-sequence ' (8) (начиная с C11) (удалено в C23)
U' c-char-sequence ' (9) (начиная с C11) (удалено в C23)

где

  • c-char является либо
  • символ из базового набора символов исходного кода, за исключением апострофа ( ' ), обратной косой черты ( \ ) или символа новой строки.
  • escape-последовательность: одна из специальных символьных последовательностей \ ' \ " \ ? \\ \a \b \f \n \r \t \v , шестнадцатеричных escape-последовательностей \x... или восьмеричных escape-последовательностей \... , как определено в разделе escape sequences .
(начиная с C99)
  • c-char-sequence представляет собой последовательность из двух или более c-char s.
1) однобайтовая целочисленная символьная константа, например 'a' или ' \n ' или ' \13 ' . Такая константа имеет тип int и значение, равное представлению c-char в исполнительной кодировке как значения типа char , преобразованного в int . Если c-char не может быть представлен как одиночный байт в исполнительной кодировке, значение определяется реализацией.
2) Символьная константа UTF-8, например u8 'a' . Такая константа имеет тип char8_t и значение, равное значению кодовой позиции ISO 10646 для c-char , при условии, что значение кодовой позиции представимо одним блоком кода UTF-8 (то есть c-char находится в диапазоне 0x0-0x7F включительно). Если c-char не может быть представлен одним блоком кода UTF-8, программа является некорректной.
3) 16-битная широкосимвольная константа, например u '貓' , но не u '🍌' ( u ' \U0001f34c ' ). Такая константа имеет тип char16_t и значение, равное значению c-char в 16-битной кодировке, создаваемой функцией mbrtoc16 (обычно UTF-16). Если c-char не представим или отображается на более чем один 16-битный символ, значение определяется реализацией.
4) 32-битная широкосимвольная константа, например U '貓' или U '🍌' . Такая константа имеет тип char32_t и значение, равное значению c-char в 32-битной кодировке, создаваемой функцией mbrtoc32 (обычно UTF-32). Если c-char не представим или отображается на более чем один 32-битный символ, значение определяется реализацией.
(до C23)
3) UTF-16 символьная константа, например u '貓' , но не u '🍌' ( u ' \U0001f34c ' ). Такая константа имеет тип char16_t и значение, равное значению кодовой позиции ISO 10646 для c-char при условии, что значение кодовой позиции представимо одним кодовым блоком UTF-16 (то есть c-char находится в диапазоне 0x0-0xD7FF или 0xE000-0xFFFF включительно). Если c-char не представим одним кодовым блоком UTF-16, программа является некорректной.
4) UTF-32 символьная константа, например U '貓' или U '🍌' . Такая константа имеет тип char32_t и значение, равное значению кодовой позиции ISO 10646 для c-char при условии, что значение кодовой позиции представимо одним кодовым блоком UTF-32 (то есть c-char находится в диапазоне 0x0-0xD7FF или 0xE000-0x10FFFF включительно). Если c-char не представим одним кодовым блоком UTF-32, программа является некорректной.
(начиная с C23)
5) широкий символьный литерал, например L 'β' или L '貓 . Такой литерал имеет тип wchar_t и значение, равное значению c-char в выполняемой широкосимвольной кодировке (то есть значению, которое было бы получено с помощью mbtowc ). Если c-char не представим или отображается более чем в один широкий символ (например, значение вне BMP в Windows, где wchar_t является 16-битным), значение определяется реализацией.
6) многознаковая константа, например 'AB' , имеет тип int и определяемое реализацией значение.
7) широкий многобайтовый символьный констант, например L 'AB' , имеет тип wchar_t и определяемое реализацией значение.
8) 16-битная многобайтовая константа, например u 'CD' , имеет тип char16_t и определяемое реализацией значение.
9) 32-битная многобайтовая константа, например U 'XY' , имеет тип char32_t и определяемое реализацией значение.

Примечания

Многобайтовые константы были унаследованы языком C из языка программирования B. Хотя стандартом C не специфицировано, большинство компиляторов (за заметным исключением MSVC) реализуют многобайтовые константы в соответствии со спецификацией B: значения каждого символа в константе инициализируют последовательные байты результирующего целого числа в порядке big-endian с выравниванием по правому краю и дополнением нулями, например, значение ' \1 ' равно 0x00000001 , а значение ' \1 \2 \3 \4 ' равно 0x01020304 .

В C++, кодируемые обычные символьные литералы имеют тип char , а не int .

В отличие от целочисленных констант , символьная константа может иметь отрицательное значение, если char является знаковым: в таких реализациях ' \xFF ' представляет собой int со значением - 1 .

При использовании в управляющем выражении #if или #elif , символьные константы могут интерпретироваться в терминах исходного набора символов, исполнительного набора символов или некоторого другого реализационно-определенного набора символов.

16/32-битные многобайтовые константы не получили широкой поддержки и удалены в C23. Некоторые распространённые реализации (например, clang) вообще их не принимают.

Пример

#include <stddef.h>
#include <stdio.h>
#include <uchar.h>
int main(void)
{
    printf("constant value     \n");
    printf("-------- ----------\n");
    // целочисленные символьные константы,
    int c1='a'; printf("'a':\t %#010x\n", c1);
    int c2='🍌'; printf("'🍌':\t %#010x\n\n", c2); // определяется реализацией
    // многобайтовая символьная константа
    int c3='ab'; printf("'ab':\t %#010x\n\n", c3); // определяется реализацией
    // 16-битные широкие символьные константы
    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);
    // определяется реализацией (🍌 отображается на два 16-битных символа)
    char16_t uc4 = u'🍌'; printf("'🍌':\t %#010x\n\n", (int)uc4);
    // 32-битные широкие символьные константы
    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);
    // широкие символьные константы
    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);
}

Возможный вывод:

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

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 6.4.4.5 Символьные константы (стр: 63-66)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 6.4.4.4 Символьные константы (стр: 48-50)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 6.4.4.4 Символьные константы (стр: 67-70)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 6.4.4.4 Символьные константы (стр: 59-61)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 3.1.3.4 Символьные константы

Смотрите также

C++ documentation for Character literal