В C (и C ++) символ апострофа '
используется для формирования символьной константы . Обычно между апострофами идет один символ как 'A'
, или escape-последовательность, представляющая один символ, например '\n'
или '\001'
или '\x01'
.
По историческим причинам допустимо помещать несколько фактических символов между апострофами, как в 'AB'
или в случае, о котором вы спрашивали, '10'
. Это так называемые многосимвольные символьные константы .
Это сомнительная вещь. В результате реализация определена , что означает, что она может делать разные вещи под разными компиляторами (хотя документация должна рассказать вам, что она делает). Это также может сильно отличаться между C и C ++.
Поскольку он не совсем четко определил, что он делает, и поскольку его мало используют, даже если он был четко определен, обычный совет - просто не использовать многосимвольные символьные константы. (И если вы не используете их, вам даже не нужно знать, что они делают.)
В большинстве компиляторов Си то, что вы получаете, когда вы делаете это, является результатом "добавления" двух символов в память, то есть создания 16-разрядного числа, помещая два 8-разрядных числа рядом друг с другом. (На данный момент я предполагаю, что в многосимвольной константе только два символа, хотя на самом деле их может быть даже больше) Проще всего это объяснить на примере:
#include <stdio.h>
int main()
{
printf("%d (%02x) %d (%02x) -> %d (%02x)\n", 'A', 'A', 'B', 'B', 'AB', 'AB');
printf("%d (%02x) %d (%02x) -> %d (%02x)\n", '1', '1', '0', '0', '10', '10');
}
На моей машине это печатает
65 (41) 66 (42) -> 16706 (4142)
49 (31) 48 (30) -> 12592 (3130)
(Но, заметьте, на моем компьютере мой компилятор выдает мне сообщение «предупреждение: многосимвольная символьная константа», усиливая представление о том, что многосимвольные константы обычно плохая идея.)
Просмотр второго примера как байтов в памяти; «1» выглядит как
+------+
+----------+
| 0x31 |
или | 00110001 |
+------+
+----------+
А '10' выглядит как
+------+------+
+----------+----------+
| 0x31 | 0x30 |
или | 00110001 | 00110000 |
+------+------+
+----------+----------+
Откуда пришло это число 12592? Это десятичное представление шестнадцатеричного числа 0x3130. Или, говоря иначе, это 256 × 49 + 48.