我使用gcc
来编译它:
int a=1;
printf("%d\n",a);
printf("%f\n",a);
printf("%f\n",(float)a);
我明白了:
1
0.000000
1.000000
为什么隐式转换输出错误?
答案 0 :(得分:3)
没有转换。 printf不是接受浮点数的函数。它是一个接受可以是任何类型的参数列表的函数。
编译器假定给出了一个浮点数,并且您看到基本上未定义的行为。
没有机制可以解析输入字符串,然后对每个参数应用自定义转换。你应该非常小心你传递给printf的东西,因为这样就可以打开漏洞。
答案 1 :(得分:2)
因为double
(%f
期望的)可能大于您平台上的int
。没有"隐式转换&#34 ;;它将传递int
作为第二个参数,printf()
将读取double
。
顺便说一下,这是不明确的行为,不要这样做。
答案 2 :(得分:2)
在您的代码中
int a=1;
//something
printf("%f\n",a);
没有隐式转换,而是格式说明符的不当使用,这会产生undefined behaviour。
相关:C11
标准,章节§7.21.6.1,fprintf()
功能
如果有任何论据 不是相应转换规范的正确类型,行为是 未定义。
答案 3 :(得分:0)
因为使用错误的格式说明符是未定义的行为。它可以打印任何东西。
实际上它取决于ABI以及它如何传递浮点数参数和int参数。在许多系统中,浮点值在为此用途保留的寄存器中传递,而int值在不同的寄存器中传递。这似乎就是这种情况。
答案 4 :(得分:0)
第二个printf
没有转化。您通过使转换说明符("%f"
)与值的类型(int
)不匹配来调用未定义的行为。
答案 5 :(得分:0)
通过执行printf("%f\n",a);
,您正在调用未定义的行为。
然而,通过执行printf("%f\n",(float)a);
,您输入整数a
,以便按预期将值打印为float。
答案 6 :(得分:0)
printf
以自己的二进制格式获取其参数。 格式字符串实际上是如何解释这种二进制数据的描述。如果此格式字符串与实际提供的二进制数据不对应,则行为最多不确定。