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

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,它们都打印相同的精度,那么是什么原因导致%lf在C90中无法正常工作?

7
因为直到后来才被标准化? - Some programmer dude
3
%lf 对于 printf 系列没有用处,只适用于 scanf 系列。 - Sander De Dycker
可能是重复问题:https://dev59.com/WGw15IYBdhLWcg3wy-zO - Valeri Atamaniouk
3
你可能让事情变得混淆了,double 应该使用 %f 而不是 %lf 进行打印。 - Jens Gustedt
2个回答

8
根据C90文档:
一个可选的l(小写的L)用于指定接下来的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与任何其他转换说明符一起出现,则行为是未定义的。

5

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

C89规定,在f之前加上l会导致未定义的行为。而C90可能也是这样规定的。

另一方面,C99规定,在f之前加上l没有任何效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接