Jin*_*Jin 7 c sizeof addition integer-promotion
我对sizeof
C中的运算符感到困惑.
#include <stdio.h>
int main(void)
{
char num1=1, num2=2, result;
result = num1 + num2;
printf("Size of result: %d \n",sizeof result);
printf("Size of result: %d \n",sizeof(num1+num2));
}
Run Code Online (Sandbox Code Playgroud)
结果分别为1和4.为什么会这样?
TL; DR回答:
sizeof result
和...一样sizeof(char)
.sizeof(num1+ num2)
和sizeof (int)
为什么一样?在您的情况下,它们分别产生1(标准保证)和4(可能变化).
也就是说,sizeof
产生一个类型的结果size_t
,所以你应该%zu
格式化说明符来打印该值.
为什么:
首先,对于加法运算符+
,引用C11
,章节§6.5.6
如果两个操作数都具有算术类型,则对它们执行通常的算术转换.
关于通常的算术转换,§6.3.1.8/ p1
[....]否则,将对两个操作数执行整数提升.[...]
然后从§6.3.1.1,/ p2开始,
如果a
int
可以表示原始类型的所有值(由宽度限制,对于位字段),则该值将转换为int
; 否则,它被转换为unsigned int
.这些被称为整数促销.
所以,sizeof(num1+num2)
是一样的sizeof(int)
.
result
是char
类型,因此sizeof
是给予1
,同时num1+num2
提升为int
类型,因此它给予4
(大小int
)。
请注意,当对小于 的类型执行算术运算int
并且其所有值都可以表示时,int
结果将提升为int
类型。