Символьная константа
Синтаксис
'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...или восьмеричные экранирования\...как определено в последовательностях экранирования.
| (с C99) |
- c-последовательность-символов это последовательность из двух или более c-символов.
'a' или '\n' или '\13'. Такая константа имеет тип int и значение, равное представлению c-символа в наборе символов выполнения как значение типа char сопоставленного с int. Если c-символ не может быть представлен одним байтом в наборе символов выполнения, значение является определенным реализацией.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) |
L'β' или L'貓. Такая константа имеет тип wchar_t и значение, равное значению c-символа в наборе символов выполнения (т.е. значению, которое было бы получено из mbtowc). Если c-символ не может быть представлен или отображается на более чем один символ (например, не-BMP значение в Windows, где wchar_t имеет 16 бит), значение является определенным реализацией.'AB', имеет тип int и значение, определённое реализацией.L'AB', имеет тип wchar_t и значение, определённое реализацией.u'CD', имеет тип char16_t и значение, определённое реализацией.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