2016-02-09 3 views
8

Что будет печатать ff на экране?Почему sizeof (char + char) возвращает 4?

Я думал, что sizeof (char) = 1, что sizeof (a + b) будет равно 1, но оказалось, что я 4. Я не понимаю этого, почему он пишет 4, если мы добавляем два символа?

+0

Что вы ждете? Что вы читали о 'sizeof' -операторе? –

+0

Я ожидал, что он вернется 1. Я знаю, что он возвращает размер типа или переменной в байтах, точнее количество символов, которые могут там поместиться. – Nebeski

+0

'a + b' - целочисленная оценка. –

ответ

12

В операндах языка Си почти все арифметических операторов подвергаются неявным преобразованиям, называемых обычных арифметические преобразованиями или, в данном случае, целочисленного продвижение. Операнды типа 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)); 
+0

Никогда не слышал о _интегральных акциях. – chux

+0

@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

+0

@Chris Я вижу: -> «Интегральные акции» - это старый термин C90, формальный стандартный термин - целые рекламные акции. – chux

6

Это не то же самое, как sizeof(char), аргумент (то есть результат добавление) составляет int, поэтому sizeof(a + b) фактически эквивалентен sizeof(int). Если вы произведете результат до char, это будет то, что вы ожидаете. Кроме того, правильный формат спецификации для sizeof результат который является size_t является %zu, а не %d.

Попробуйте

printf("%zu", sizeof((char) (a + b))); 
Смежные вопросы