#include <stdio.h>
int main()
{
short int i = 20;
char c = 97;
printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i));
return 0;
}
此代码的输出是
2, 1, 4
据我说它应该是
2, 1, 2
因为char + short int
为short int
且short int
的尺寸为2
。
答案 0 :(得分:6)
根据C标准integral promotion rules,表达式c + i
的类型将为int
,这就是为什么你得到sizeof (int)
的等价物,即{{1 }}
当在某些类型的表达式中使用不同的算术类型作为操作数时,将应用称为常规算术转换的标准转换。根据算术类型的等级应用这些转换:具有较低等级类型的操作数被转换为具有较高等级的操作数的类型。这称为积分或浮点促销。
除此之外,根据here,算术运算符不接受小于4
的类型作为参数,并自动应用整数提升。因此,即使是int
,您也会获得4
。
您可以从This International Standard - Programming languages — C, Section 6.3.1.1, Clause 2找到以下信息:
[...]如果intcan表示原始类型的所有值(受宽度限制,对于位域),该值将转换为int;否则,它将转换为无符号 INT。这些被称为整数促销。整数提升仅适用于:通常算术转换的一部分,某些参数表达式,一元+, - 和〜运算符的操作数,以及移位运算符的两个操作数,如各自的子条款所指定。 )[...]