Ответ 1
Во-первых, согласно ANSI/IEC 9899: 1999 (E) §6.4.4.4:
10. Целочисленная символьная константа имеет тип int. Значение целочисленной символьной константы содержащий один символ, который сопоставляется однобайтовому символу выполнения, является числовое значение представления отображаемого символа, интерпретируемого как целое число. [...]
§6.5.3.4:
2. Оператор sizeof дает размер (в байтах) своего операнда, который может быть выражение или имя в скобках типа. Размер определяется по типу операнд. [...]
3. При применении к операнду, который имеет тип char, unsigned char или подписанный char, (или его квалифицированной версии), результат равен 1. [...]
Как вы можете видеть, поскольку тип символьной константы int
, для sizeof('a')
мы получаем sizeof(int)
, что равно 4 на вашей платформе. Однако для sizeof(c)
мы получаем размер a char
, который определяется как 1.
Итак, почему мы можем назначить 'a'
a char
?
§6.5.16.1:
2. В простом присваивании (=) значение правильного операнда преобразуется в тип выражения присваивания и заменяет значение, хранящееся в объекте, обозначенном левым операндом.
Итак, int
, то есть 'a'
, неявно преобразуется в char
. Там также есть пример, явно показывающий, что int
может быть неявно преобразован в char
.