使用float格式说明符打印int变量

int main() { int a=5; float b=7.5; printf("%d %f\n",a,b); printf("%d %f\n",a,a); return 0; } 

当我在gcc编译器中编译这个输出时是

 5 7.500000 5 7.500000 

但是在视觉工作室中,输出是

 5 7.500000 5 0.000000 

我无法理解gcc编译器输出。

printf原型是:

 int printf(const char *format, ...); 

C11(n1570),第6.5.2.2节函数调用

函数原型声明符中的省略号表示法导致参数类型转换在最后声明的参数之后停止。 默认参数提升是在尾随参数上执行的。

C11(n1570),第6.5.2.2节函数调用

对每个参数执行整数提升,并将类型为float的参数提升为double。 这些被称为默认参数促销。

因此,没有使用printf调用执行其他参数提升。 特别是, a不会转换为double 。 因此,它将导致未定义的行为: printf将尝试获取具有给定大小( sizeof(double) )和给定内存表示的sizeof(double) ,这可能与int不同。

C11(n1570),§7.21.6.1fprintf函数

如果转换规范无效,则行为未定义。 如果任何参数不是相应转换规范的正确类型,则行为未定义。

此外,您可以查看gcc生成的ASM代码,了解正在发生的事情。