Может ли кто-нибудь рассказать, как 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