为什么sizeof(char + char)返回4?

9
char  a, b;     
printf("%d", sizeof(a+b));

printf会输出什么内容?

我以为因为sizeof(char)=1,所以sizeof(a+b)也应该是1,但实际上它是4。我不理解这个问题,为什么当我们加两个字符时它会输出4?


你期望什么?你读到了关于 sizeof 运算符的什么内容? - Iharob Al Asimi
我期望它返回1。我知道它返回类型或变量在字节中的大小,更确切地说是可以适合其中的字符数。 - Nebeski
"a+b" 是一个整数求值。 - Weather Vane
1
可能是 C/C++ 中字符 'a' 的大小 的重复问题。 - Bo Persson
1
@BoPersson 不是重复:'a' 已经是一个 int,但是这个问题是关于将 char 提升为整数的。 - M.M
2个回答

12
在C语言中,几乎所有算术运算符的操作数都会被隐式转换为所谓的“常规算术转换”或在本例中称为“整数提升”。类型为char的操作数会提升为int型,实际加法是在int(或unsigned int,这取决于该平台上char的属性)域内执行的。因此,您的a + b实际上被解释为(int) a + (int) b。结果的类型为int,而在您的平台上sizeof(int)显然为4,这就是您看到的4。
并且不要使用%d来printf sizeof的结果。sizeof的结果类型为size_t,而%d需要一个int类型的参数。因此,请使用正确的格式说明符。
printf("%zu\n", sizeof(a+b));

或者至少在确定它适合时对参数进行转换

printf("%d\n", (int) sizeof(a+b));

从未听说过“整数提升”。 - chux - Reinstate Monica
@Chris 我了解:--> "Integral promotions" 是旧的 C90 术语,正式标准术语是整数提升。 - chux - Reinstate Monica
谢谢,如果a和b是浮点数且sizeof(float)=4,那么sizeof(a+b)会返回什么?它会提升/降低还是保持为浮点数? - Nebeski
@Nebeski建议你尝试一下。 - Weather Vane
2
@Nebeski:float类型不会被提升。在某些古老的C语言标准之前,float类型曾经被无条件地提升为double类型。但是这个想法在C89/90发布之前就被放弃了。在标准C中,这种表达式中的float类型不会被提升为double类型。(但是当将参数传递给具有未声明参数的函数时,float类型会被隐式转换为double类型。) - AnT stands with Russia
显示剩余6条评论

6
这与sizeof(char)不同,参数(即加法结果)被提升为int,因此sizeof(a + b)实际上等价于sizeof(int)。如果将结果转换为char,则会得到您期望的值。另外,sizeof结果的正确格式说明符是size_t,而不是%d,应使用%zu
尝试一下。
printf("%zu", sizeof((char) (a + b)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接