12

我是一个初学者编程学生,只是想了解这背后的原因。

当我使用此代码时:

#include <stdio.h>
int main()
{
 double pi = 3.1415926535897932;
 printf("%lf",pi);
 return 0;
}

编译器给出这个警告。ISO C90 不支持 '%lf' gnu_printf 格式 [-Wformat]

我在 ubuntu 终端中使用 gcc 编译器 (-o -Wall -ansi -pedantic-errors)

这背后的原因是什么?我搜索了网页,发现在 C99 中允许使用这种用法。为什么 C90 不允许在 printf 中使用 %lf?我可以使用 %.16lf 或 %.16f 并以相同的精度打印,那么在 C90 中导致 %lf 不好的问题是什么?

4

2 回答 2

8

根据 C90 文档:

可选的 l (ell) 指定后面的 d 、 i 、 o 、 u 、 x 或 X 转换说明符适用于 long int 或 unsigned long int 参数;一个可选的 l 指定后面的 n 转换说明符应用于指向 long int 参数的指针;或一个可选的 L 指定后面的 e 、 E 、 f 、 g 或 G 转换说明符适用于long double参数。如果 h 、 l 或 L 与任何其他转换说明符一起出现,则行为未定义。

于 2013-03-25T12:20:51.377 回答
5

C 是一种不断发展的语言。每个新版本的 C 标准都会添加新的特性和行为。

C89 说l之前f会导致未定义的行为。C90 可能也是这么说的。

另一方面,C99 说l之前f没有效果。

于 2013-03-25T12:23:48.813 回答