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 编译器的输出。
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, ...);
函数原型声明器中的省略号会导致参数类型转换在最后一个声明的参数之后停止。默认参数提升是在尾随参数上执行的。
对每个参数执行整数提升,浮点类型的参数提升为双精度。这些称为默认参数提升。
因此,不会通过调用执行其他参数提升printf
。特别是,a
不转换为double
. 因此,它将导致未定义的行为:printf
将尝试获取double
具有给定大小 ( sizeof(double)
) 和给定内存表示的 a,这可能与 a 不同int
。
fprintf
函数如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义。
此外,您可以查看gcc生成的 ASM 代码以了解发生了什么。