#include <stdio.h>
int main() {
float a = 1234.5f;
printf("%d\n", a);
return 0;
}
它显示一个0
!!这怎么可能?理由是什么?
我特意放了一个%d
in the printf
研究行为的声明printf
.
那是因为%d
期望一个int
但你已经提供了一个浮动。
Use %e
/%f
/%g
打印浮动。
关于为什么打印0:浮点数转换为double
发送至之前printf
。小尾数中的双重表示形式的数字 1234.5 是
00 00 00 00 00 4A 93 40
A %d
消耗 32 位整数,因此打印零。 (作为测试,您可以printf("%d, %d\n", 1234.5f);
你可以得到输出0, 1083394560
.)
至于为什么float
被转换为double
,因为 printf 的原型是int printf(const char*, ...)
,从 6.5.2.2/7 开始,
函数原型声明符中的省略号表示法会导致参数类型转换在最后一个声明的参数之后停止。默认参数提升是对尾随参数执行的。
从 6.5.2.2/6 开始,
如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,和具有类型的参数float
被提升为double
.这些被称为默认参数促销.
(感谢 Alok 发现了这一点。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)