12.7 有人告诉我在printf 中使用%lf 不正确。那么, 如果scanf() 需要
%lf, 怎么可以用在printf() 中用%f 输出双精度数呢?
printf 的%f 标识符的确既可以输出浮点数又可以输出双精度数。根据“缺
省参数扩展” 规则, 不论范围内有没有原形都会在在类似printf 的可变长度参
数列表中采用, 浮点型的变量或扩展为双精度型, 因此printf() 只会看到双精度
数。printf() 的确接受%Lf, 用于输出长双精度数。参见问题12.11 和15.2。
参考资料: [K&R1, Sec. 7.3 pp. 145-47, Sec. 7.4 pp. 147-50]; [K&R2, Sec.
7.2 pp. 153-44, Sec. 7.4 pp. 157-59]; [ISO, Sec. 7.9.6.1, Sec. 7.9.6.2]; [H&S, Sec.
15.8 pp. 357-64, Sec. 15.11 pp. 366-78]; [CT&P, Sec. A.1 pp. 121-33]。
15.2 为什么%f 可以在printf() 参数中, 同时表示float 和double?他
们难道不是不同类型吗?
“参数默认晋级” 规则适用于在可变参数中的可变动部分: char 和short int 晋
级到int, float 晋级到double。同样的晋级也适用于在作用域中没有原型说明的函
数调用, 即所谓的“旧风格” 函数调用, 参见问题11.4。所以printf 的%f 格式总是
得到double。类似的, %c 总是得到int, %hd 也是。参见问题12.7, 12.13。
参考资料: [ISO, Sec. 6.3.2.2]; [H&S, Sec. 6.3.5 p. 177, Sec. 9.4 pp. 272-3]。
贴士完整的内容,大家可以根据参考找到相关资料,特别是标准。注意这里的ISO Sec 6.3.3.2。很遗憾的是,ISO C++03没有对可变参数的说明,刚刚翻了很久。