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
但是在visual studio中,输出是
5 7.500000
5 0.000000
我无法理解gcc编译器输出。
答案 0 :(得分:3)
printf
原型是:
int printf(const char *format, ...);
函数原型声明符中的省略号表示法导致 参数类型转换在最后声明的参数后停止。 默认参数 促销是在尾随参数上执行的。
对每个参数和参数执行整数提升 将float类型提升为double。这些被称为默认参数 促销。
因此,printf
调用不会执行其他参数提升。特别是,a
未转换为double
。因此,它将导致未定义的行为:printf
将尝试获取具有给定大小(double
)的sizeof(double)
和给定的内存表示,这可能与{{1}不同}}
int
函数如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义。
此外,您可以查看 gcc 生成的ASM代码,了解正在发生的事情。