printf的c行为(“%d”,<double>)

时间:2016-03-09 18:43:26

标签: c gcc compilation

为什么此代码会打印无意义的值?如果它有意义那么它是什么?

printf("%d\n", 5.0 / 4);

顺便说一下,我知道格式说明符我应该使用%f而不是%d。但我想知道c究竟做了什么。

奇怪的是,每次运行编译的程序时,它都会打印出不同的东西。它不一定是确定性的吗?

据我所知,此代码打印出类似的内容:

float c;
printf("%d\n", &c);

他们有关系吗?

当我尝试时:

float c;
printf("%d\n%d\n", c, &c);

这两个值之间有一个常数252。 256 - sizeof(float)可能吗? 并将c声明为double会产生差异0。

提前致谢!

更新:在不同的机器上编写相同的代码会产生不同的结果。(252为56.前者为64位ubuntu机器,后者为64位OS X)

1 个答案:

答案 0 :(得分:0)

printf不寻常,因为它没有单一的功能签名。换句话说,没有机制可以自动获取您传递的实际参数并将其转换为预期的类型。无论你试图通过什么,都会过去。如果您传递的类型与相应格式说明符所期望的类型不匹配,则会产生无意义。

此外,如果您传递的不匹配类型与格式说明符所期望的类型不同,printf最终可能会从堆栈中弹出随机垃圾,这与您的想法无关你通过了。

你问,&#34;它不是必须具有确定性吗?&#34;,答案非常强调&#34; NO &#34; !通过将错误类型的值传递给printf,您调用了未定义的行为,这意味着任何事情都可能发生,并且它绝对不必是两次相同的事情。

(即使他们不需要,一些编译器会查看格式字符串并尝试检查您传递的值是否符合预期的值。例如,在gcc下,您的第一个代码片段会收到警告&#34;格式'%d'需要类型'int',但参数2的类型为'double'&#34;但我不知道编译器会尝试转换为&#34;修复&#34;参数。)