Может ли кто-нибудь рассказать, как sizeof(char expression)
будет sizeof(int)
?
int main()
{
char a, b;
printf("%d\n", sizeof(a+b));
return 0;
}
Программа выводит 4
в качестве вывода. Я ожидал, что это будет sizeof(char)
т.е. 1
Может ли кто-нибудь рассказать, как sizeof(char expression)
будет sizeof(int)
?
int main()
{
char a, b;
printf("%d\n", sizeof(a+b));
return 0;
}
Программа выводит 4
в качестве вывода. Я ожидал, что это будет sizeof(char)
т.е. 1
Целое продвижение по службе.
Когда малые интегральные типы (меньше int
, такие как char
, short
и т.д.), находятся в арифметическом выражении, они автоматически повышаются до int
.
C11 §6.3.1.1 Булево, символы и целые числа
Если
int
может представлять все значения исходного типа (ограниченные шириной для битового поля), значение преобразуется вint
; в противном случае он преобразуется вunsigned int
. Они называются целыми акциями. 58)
И в сноске:
58) Целые рекламные акции применяются только: как часть обычных арифметических преобразований к некоторым выражениям аргумента к операндам унарных операторов
+
,-
и~
, а также для обоих операндов операторы сдвига, как указано в их соответствующих подпунктах.
a+b
- выражение int
. a
и b
будут char
выражениями.
При использовании большинства операторов в C операнды интегрального типа, но более узкие, чем int
, продвигаются до int
.
Согласно стандарту C (6.5.6 аддитивные операторы):
4 Если оба операнда имеют арифметический тип, обычная арифметика на них выполняются преобразования.
Обычные арифметические преобразования включают целую рекламу (6.3.1.1 Логические, символы и целые числа):
Если int может представлять все значения исходного типа (как ограниченный по ширине, для битового поля), значение преобразуется в int; в противном случае он преобразуется в unsigned int. Они называются целые рекламные акции
Итак, в этом выражении
a + b
оба операнда преобразуются в тип int
, и результат имеет этот общий тип операндов, который int