2
#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;    
}

Firstprintf()给出 output0.000000但 secondprintf()给出 output 1.000000。为什么?

在 Windows 7 64 位上使用代码块。

使用 gcc 命令编译给我一个 .exe,它为两个语句输出 1.000000。

如果我在 Codeblocks 上按 F9 进行编译,第一条语句得到 0.000000,第二条语句得到 1.000000。

最后,如果我#include <stdio.h>从 Codeblocks 中的源代码中删除,都给我 1.000000(没有警告或错误)。

4

1 回答 1

4

您的代码应该在 C99 或 C11 编译器上为两行打印相同的值。to 的所有float参数printf总是转换为double%lf并且%f两者都做同样的事情(打印 a double)。

在 C89 标准中,说明%lf符是未定义的行为,并且doubles 只能用%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 与任何其他转换说明符一起出现,则行为未定义。

于 2017-12-21T15:15:30.053 回答