Character constant
Содержание |
Синтаксис
'
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.
|
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) |
Примечания
Многобайтовые константы были унаследованы языком 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
|