在C中添加两种不同类型时会发生什么?

在C中添加两种不同类型时会发生什么?,c,types,type-conversion,C,Types,Type Conversion,给定以下代码: int foo = 5; int *foo_ptr = &foo; return foo_ptr + foo; 返回类型是指针还是int?更一般地说,编译器在将不同的类型添加到一起时会做什么?在C中,两个不同数字类型的总和涉及到首先提升参数,使类型相同,然后添加。C11标准中损坏的精确算法描述为“通常算术转换”,并且可以找到一个总结(C++和C标准在这点上是相同的)。基本上,算法是选择这两种类型中哪一种是更宽的浮点类型,或者如果不是浮点,则选择。最窄的整数类型至少与in

给定以下代码:

int foo = 5;
int *foo_ptr = &foo;
return foo_ptr + foo;

返回类型是指针还是int?更一般地说,编译器在将不同的类型添加到一起时会做什么?

在C中,两个不同数字类型的总和涉及到首先提升参数,使类型相同,然后添加。C11标准中损坏的精确算法描述为“通常算术转换”,并且可以找到一个总结(C++和C标准在这点上是相同的)。基本上,算法是选择这两种类型中哪一种是更宽的浮点类型,或者如果不是浮点,则选择。最窄的整数类型至少与
int
一样宽,后者是两种类型的超集

将整数添加到指针
p+i
i+p
&p[i]
(或
&i[p]
相同)。计算如下:

&(char*)p + i * (sizeof *p)

如果
p
void*

你说的“提升”是什么意思,那就不可能了?
p+i
i+p
相同吗?@shelvavu:是的,通常的算术转换是对称的。标准用了整整一页来描述它们,这似乎有些过分。我插入了一个指向在线资源的链接和一句话的摘要,其中包含了算法中一些模糊的角落。