在printf格式说明符和pow函数中{C float或double

时间:2017-12-21 14:35:12

标签: c printf double pow specifier

#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(没有警告或错误)。

1 个答案:

答案 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与任何其他转换说明符一起出现,则行为未定义。