问题描述
int main( )
{
int x = 5;
float y = 3.1f;
printf("int x=%d,float x=%f,y=%f,y=%d\n",x,y,y); //X86
return 0;
}
我认为答案是 5 、 5.0 、 3.1 、 3。 但答案是 enter image description here
为什么?
解决方法
%d
格式说明符需要一个 int
类型的参数,而 %f
需要一个 double
类型的参数(可能从 float
提升)。如果传递错误类型的参数,则行为未定义。
解决方案:不要那样做。
(最可能的行为是包含 int
值的内存或寄存器将显示为好像它是 double
类型,但任何事情都可能发生。)
对于大多数函数调用,将 int
传递给需要 double
参数的函数会导致值被转换,因此 42
变为 42.0
。但是由于 printf
是可变参数,预期的类型是由格式字符串决定的,而不是参数类型,所以编译器一般无法知道生成类型转换。