计划的产出

时间:2017-12-02 10:06:38

标签: c sizeof integer-promotion

#include<stdio.h>

int main() {
 short int i=20;
char c=97;
printf("%d,%d,%d",sizeof(i),sizeof(c),sizeof(c+i));
return 0;
}

假设给定short int = 2的大小,char为1且int为4B 好吧如果我在机器上运行它会给出2,1,4 但是ans 2,1,2

1 个答案:

答案 0 :(得分:5)

对于初学者来说,这个电话

printf("%d,%d,%d",sizeof(i),sizeof(c),sizeof(c+i));

具有未定义的行为,因为使用了不正确的格式说明符。

应该看起来像

printf("%zu,%zu,%zu",sizeof(i),sizeof(c),sizeof(c+i));

因为sizeof运算符评估的值类型为size_t

由于整数促销(作为通常的算术转换的一部分),表达式c + i的类型为int

从C标准(6.3.1算术操作数)

  
      
  1. ...如果int可以表示原始类型的所有值(作为限制   按宽度,对于位字段),该值将转换为   一个int;否则,它将转换为unsigned int。 这些是   称为整数提升 .58)所有其他类型均未更改   整数促销。
  2.   

和(6.5.6加法运算符)

  

4如果两个操作数都有算术类型,则通常算术   转换是在他们身上进行的。

因此,如果int类型的对象的大小等于4,则表达式sizeof(c+i)会产生4