printf中double
的正确格式说明符是什么?是%f
还是%lf
?我想是%f
,但我不确定.
代码示例
#include <stdio.h>
int main()
{
double d = 1.4;
printf("%lf", d); // Is this wrong?
}
printf中double
的正确格式说明符是什么?是%f
还是%lf
?我想是%f
,但我不确定.
#include <stdio.h>
int main()
{
double d = 1.4;
printf("%lf", d); // Is this wrong?
}
"%f"
是(或至少一个)正确的双精度格式.float
没有格式,因为如果你试图把float
传给printf
,在printf
收到它之前,它会被提升到double
."%lf"
在当前标准下也是可以接受的——l
后面跟f
转换说明符(除其他外),则被指定为无效.
请注意,这是一个printf
个格式字符串与scanf
个(和fscanf
等)格式字符串有很大不同的地方.对于输出,传递value,当作为可变参数传递时,它将从float
提升到double
.对于输入,你要通过pointer,这不是提升,所以你必须告诉scanf
你是想读float
还是double
,所以对于scanf
,%f
意味着你想读float
,%lf
意味着你想读double
(无论如何,对于long double
,你用%Lf
代表printf
或scanf
).
1.C99,§6.5.2.2/6:"如果表示被调用函数的表达式的类型不包含原型,则对每个参数执行整数提升,将类型为FLOAT的参数提升为双精度,这称为默认参数提升."在C++中,措辞略有不同(例如,它没有使用单词"Prototype"),但效果是相同的:所有可变参数在被函数接收之前都经历了默认提升.