Spec-Zone.ru › C

Символьная константа

Синтаксис

'c-символ ' (1)
u8'c-символ ' (2) (с C23)
u'c-символ ' (3) (с C11)
U'c-символ ' (4) (с C11)
L'c-символ ' (5)
'c-последовательность-символов ' (6)
L'c-последовательность-символов ' (7)
u'c-последовательность-символов ' (8) (с C11)(удалено в C23)
U'c-последовательность-символов ' (9) (с C11)(удалено в C23)

где

  • c-символ это
    • любой символ из базового набора символов исходного текста, за исключением одинарной кавычки ('), обратной косой черты (\) или символа новой строки.
    • последовательность экранирования: один из специальных экранированных символов \' \" \? \\ \a \b \f \n \r \t \v, шестнадцатеричные экранирования \x... или восьмеричные экранирования \... как определено в последовательностях экранирования.
  • имя универсального символа, \u... или \U... как определено в последовательностях экранирования.
(с C99)
  • c-последовательность-символов это последовательность из двух или более c-символов.
1) однобайтовая целочисленная символьная константа, например 'a' или '\n' или '\13'. Такая константа имеет тип int и значение, равное представлению c-символа в наборе символов выполнения как значение типа char сопоставленного с int. Если c-символ не может быть представлен одним байтом в наборе символов выполнения, значение является определенным реализацией.
2) константа символа UTF-8, например u8'a'. Такая константа имеет тип char8_t и значение, равное значению кодовой точки ISO 10646 символа c-символ, при условии, что кодовая точка может быть представлена одним кодовым элементом UTF-8 (т.е. c-символ находится в диапазоне 0x0-0x7F включительно). Если c-символ не может быть представлен одним кодовым элементом UTF-8, программа является некорректной.
3) константа широкого символа 16 бит, например u'貓', но не u'🍌' (u'\U0001f34c'). Такая константа имеет тип char16_t и значение, равное значению c-символа в 16-битном кодировании, полученном из mbrtoc16 (обычно UTF-16). Если c-символ не может быть представлен или отображается на более чем один 16-битный символ, значение является определенным реализацией. 4) константа широкого символа 32 бит, например U'貓' или U'🍌'. Такая константа имеет тип char32_t и значение, равное значению c-символа в 32-битном кодировании, полученном из mbrtoc32 (обычно UTF-32). Если c-символ не может быть представлен или отображается на более чем один 32-битный символ, значение является определенным реализацией. (до C23)
3) константа символа UTF-16, например u'貓', но не u'🍌' (u'\U0001f34c'). Такая константа имеет тип char16_t и значение, равное значению кодовой точки ISO 10646 символа c-символ, при условии, что кодовая точка может быть представлена одним кодовым элементом UTF-16 (т.е. c-символ находится в диапазоне 0x0-0xD7FF или 0xE000-0xFFFF включительно). Если c-символ не может быть представлен одним кодовым элементом UTF-16, программа является некорректной. 4) константа символа UTF-32, например U'貓' или U'🍌'. Такая константа имеет тип char32_t и значение, равное значению кодовой точки ISO 10646 символа c-символ, при условии, что кодовая точка может быть представлена одним кодовым элементом UTF-32 (т.е. c-символ находится в диапазоне 0x0-0xD7FF или 0xE000-0x10FFFF включительно). Если c-символ не может быть представлен одним кодовым элементом UTF-32, программа является некорректной. (с C23)
5) константа широкого символа, например L'β' или L'貓. Такая константа имеет тип wchar_t и значение, равное значению c-символа в наборе символов выполнения (т.е. значению, которое было бы получено из mbtowc). Если c-символ не может быть представлен или отображается на более чем один символ (например, не-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");
 
    // 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);
}

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

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

Ссылки

  • Стандарт 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++ для Символьный литерал

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/character_constant

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API