关于C中sizeof运算符的困惑

Jin*_*Jin 7 c sizeof addition integer-promotion

我对sizeofC中的运算符感到困惑.

#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.为什么会这样?

Sou*_*osh 5

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).


hac*_*cks 4

resultchar类型,因此sizeof是给予1,同时num1+num2提升为int类型,因此它给予4(大小int)。

请注意,当对小于 的类型执行算术运算int并且其所有值都可以表示时,int结果将提升为int类型。