Что будет печатать ff на экране?Почему sizeof (char + char) возвращает 4?
Я думал, что sizeof (char) = 1, что sizeof (a + b) будет равно 1, но оказалось, что я 4. Я не понимаю этого, почему он пишет 4, если мы добавляем два символа?
Что будет печатать ff на экране?Почему sizeof (char + char) возвращает 4?
Я думал, что sizeof (char) = 1, что sizeof (a + b) будет равно 1, но оказалось, что я 4. Я не понимаю этого, почему он пишет 4, если мы добавляем два символа?
В операндах языка Си почти все арифметических операторов подвергаются неявным преобразованиям, называемых обычных арифметические преобразованиями или, в данном случае, целочисленного продвижение. Операнды типа char
относятся к типу int
, и фактическое добавление выполняется в пределах int
(или unsigned int
, в зависимости от свойств char
на этой платформе). Таким образом, ваш a + b
фактически интерпретируется как (int) a + (int) b
. Результат имеет тип int
и sizeof(int)
, по-видимому, 4 на вашей платформе. Это то, что вы видите.
И не используйте %d
до printf
результат sizeof
. Результат sizeof
имеет тип size_t
, а %d
требует аргумент int
. Таким образом, либо использовать правильный спецификатор формата
printf("%zu\n", sizeof(a+b));
или, по крайней мере, бросить аргумент, если вы уверены, что он подходит
printf("%d\n", (int) sizeof(a+b));
Никогда не слышал о _интегральных акциях. – chux
@chux - это старый термин C90 - формальный стандартный термин - целые рекламные акции. См. [Здесь] (http://stackoverflow.com/questions/12094412/what-is-the-difference-between-integral-promotion-and-balancing-in-c) и [здесь] (http: // stackoverflow. com/questions/10660758/integ-promotion) for more – Krease
@Chris Я вижу: -> «Интегральные акции» - это старый термин C90, формальный стандартный термин - целые рекламные акции. – chux
Это не то же самое, как sizeof(char)
, аргумент (то есть результат добавление) составляет int
, поэтому sizeof(a + b)
фактически эквивалентен sizeof(int)
. Если вы произведете результат до char
, это будет то, что вы ожидаете. Кроме того, правильный формат спецификации для sizeof
результат который является size_t
является %zu
, а не %d
.
Попробуйте
printf("%zu", sizeof((char) (a + b)));
Что вы ждете? Что вы читали о 'sizeof' -операторе? –
Я ожидал, что он вернется 1. Я знаю, что он возвращает размер типа или переменной в байтах, точнее количество символов, которые могут там поместиться. – Nebeski
'a + b' - целочисленная оценка. –