#include <stdio.h>
#include <math.h>
int main(void){
printf("%lf\n", pow(1.0, 2.0));
printf("%f\n", pow(1.0, 2.0));
return 0;
}
首先printf()
提供输出0.000000
,但第二printf()
提供输出1.000000
。为什么呢?
在Windows 7 64位上使用代码块。
使用gcc命令编译给我一个.exe,它为两个语句输出1.000000。
如果我编译在Codeblocks上按F9,第一个语句得到0.000000,第二个语句得到1.000000。
最后,如果我从Codeblocks中的源代码中删除#include <stdio.h>
,则所有人都给我1.000000(没有警告或错误)。
答案 0 :(得分:4)
您的代码应在C99或C11编译器上为两行打印相同的值。 float
的所有printf
参数始终转换为double
,而%lf
和%f
都执行相同的操作(打印double
)。
在C89标准中,%lf
说明符是未定义的行为,double
s只应使用%f
打印。所以也许你正在使用一个不支持C99标准的旧编译器。
有关%lf
的标准的相关部分:
C99,7.19.6.1/7:
l(ell)[...]对后续的a,A,e,E,f,F,g或G转换规范没有影响。
C89,4.9.6.1:
[...]一个可选的l(ell),指定后面的d,i,o,u,x或X转换说明符适用于long int或unsigned long int参数;一个可选的l,指定后面的n转换说明符适用于指向long int参数的指针; [...]如果h,l或L与任何其他转换说明符一起出现,则行为未定义。