问有人告诉我使用%lf与printf是不对的。如何printf使用%f用于类型double,如果scanf需要%lf?
A确实如此,printf%f%f说明符同时适用于float和double参数。[脚注] 由于“默认参数提升”(适用于可变参数列表 [脚注],例如printf,无论原型是否在作用域内),类型的值float被提升为double,而printf因此只看到doubles。(printf确实接受%Lf,用于long double。)另请参阅问题 15.2。
scanf另一方面,接受指针,并且不适用任何此类提升。存储到float(通过指针)与存储到double,所以scanf区分%f和%lf.
这里有一个表格,列出了期望的参数类型printf和scanf对于各种格式说明符
[此处放置表格]
(严格来说,%lf在...下未定义printf,尽管许多系统可能接受它。为了可移植性,请始终使用%f.)
另请参阅问题 12.13。
参考:K&R1 第 7.3 节第 145-47 页,第 7.4 节第 147-50 页
K&R2 第 7.2 节第 153-44 页,第 7.4 节第 157-59 页
ISO 第 7.9.6.1 节,第 7.9.6.2 节
H&S 第 15.8 节第 357-64 页,第 15.11 节第 366-78 页
CT&P 第 A.1 节第 121-33 页