Почему этот код с '1234' компилируется в С++?
Почему это компилируется:
char ch = '1234'; //no error
Но не более 4 char
:
char ch = '12345'; //error: Too many chars in constant
(Да, я знаю, что ' '
используется для одного char
и " "
для строк, я просто экспериментировал)
Это связано с тем, что char
представлены с использованием ASCII-чисел?
Ответы
Ответ 1
Это многоканальный литерал и имеет тип int
.
С++ 11 §2.13.2 Символьные литералы
Символьный литерал - это один или несколько символов, заключенных в одинарные кавычки, как в ’x’
, необязательно перед буквой L
, как в L’x’
. Литерал символов, который не начинается с L
, является литералом обычного характера, также называемым узкосимвольным литералом. Литерал обычного символа, который содержит один c- char, имеет тип char со значением, равным числовому значению кодирования c- char в наборе символов выполнения. Литерал обычного характера, содержащий более одного c- char, представляет собой многоканальный литерал. Многоканальный литерал имеет тип int
и значение, определяемое реализацией.
Ответ 2
С++ имеет нечто, называемое "многоканальными литералами". '1234'
- пример одного. Они имеют тип int
, и оно определяется реализацией, какое значение они имеют и сколько символов они могут содержать.
Это не имеет ничего общего с тем, что символы представлены как целые числа, но есть вероятность, что в вашей реализации значение '1234'
определяется как:
'1' + 256 * '2' + 256 * 256 * '3' + 256 * 256 * 256 * '4'
или
'4' + 256 * '3' + 256 * 256 * '2' + 256 * 256 * 256 * '1'