C90不允许在printf中使用%lf,为什么?

epo*_*khe 12 c

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

当我使用这段代码时:

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

编译器发出此警告.ISO C90不支持'%lf'gnu_printf格式[-Wformat]

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

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

Nim*_*a G 9

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


Ale*_*nze 5

C是一种不断发展的语言.在C标准的每个新版本中都会添加新功能和行为.

C89说l之前f会导致未定义的行为.而C90可能也是如此.

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