【发布时间】:2014-03-06 11:04:48
【问题描述】:
scanf needs %lf for doubles and printf is okay with just %f
那么,为什么printf 和 scanf 可以接受 %d?
这就是我认为的原因:
浮点 (%f) 正好使用 64 位,而双浮点数 (%lf) 至少使用 32。编译器不知道要为正在扫描的变量分配多少位由scanf 输入,所以我们使用%lf 告诉编译器它需要至少为32 位。
好的...但是为什么我们将%d 用于scanf 和printf?为什么不%ld 和%d?对于初学者来说,%ld 在 C 中不存在。 %d 是一个有符号十进制数,至少需要 16 位。您已经告诉编译器分配给它的位数的下限是多少,所以对于scanf 来说没问题。这也是我们没有%ld 的原因。
如果我错了,请纠正我或告诉我我可以做些什么来使这个答案更好。我很确定这不是一个完美的答案。
【问题讨论】:
-
编译器不必对 %x 做任何事情。总而言之,
printf和scanf是库函数,它们解释格式字符串并使用指定格式从/到已分配的内存复制到stdin/fromstdout... -
浮点数使用 64 位,但双浮点数使用 32 ...?你确定吗?
-
对于
long %ld、long long %lld、short %hd -
@XTian,是的,我想我错了。谢谢你。来自维基百科:“双精度浮点 (%lf) 格式是一种计算机数字格式,在计算机内存中占用 8 个字节(64 位),并通过使用浮点表示广泛的动态值范围。” - en.wikipedia.org/wiki/Double_precision_floating-point_format