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

Neb*_*ski 9 c sizeof char

char  a, b;     
printf("%d", sizeof(a+b));
Run Code Online (Sandbox Code Playgroud)

printf写入屏幕的内容是什么?

我认为因为sizeof(char)= 1,sizeof(a + b)也将是1,但结果是4.我不明白这一点,如果我们添加两个字符,为什么写4?

AnT*_*AnT 12

在C语言中,几乎所有算术运算符的操作数都受到称为常规算术转换的隐式转换,或者在这种情况下是整数提升.类型的操作数char被提升为类型int,并且实际添加在域内执行int(或者unsigned int,取决于char该平台上的属性).所以你a + b的实际解释是(int) a + (int) b.结果有类型int,sizeof(int)在您的平台上显然是4.那就是你看到的4.

并且不要使用%dprintf结果sizeof.sizeof有类型的结果size_t,同时%d需要一个int参数.因此,要么使用正确的格式说明符

printf("%zu\n", sizeof(a+b));
Run Code Online (Sandbox Code Playgroud)

或者至少如果你确定它适合的话就抛出论点

printf("%d\n", (int) sizeof(a+b));
Run Code Online (Sandbox Code Playgroud)

  • @Nebeski:`float`没有升级.回到一些古老的预先标准版本的C`flov`曾被无条件地提升为"double".但在C89/90发布之前,这个想法就被放弃了.在标准C中,`float`在这样的表达式中不会被提升为`double`.(当向具有未声明参数的函数传递参数时,`float`会被隐式转换为`double`.) (2认同)

Iha*_*imi 6

这是不一样的sizeof(char),参数(即加法的结果)被提升到int如此sizeof(a + b),其实是等同于sizeof(int).如果你将结果投射到char它将是你所期望的.此外,正确的格式说明sizeof结果是size_t%zu而非%d.

尝试

printf("%zu", sizeof((char) (a + b)));
Run Code Online (Sandbox Code Playgroud)