2013-03-25 67 views
9

我是一名初学者编程的学生,只是想了解背后的原因。C90不允许在printf中使用%,为什么?

当我使用此代码:

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

编译器会发出这样的警告。 ISO C90不支持 '%LF' gnu_printf格式[-Wformat]

我用gcc编译器在Ubuntu终端用(-O -Wall -ansi -pedantic-错误)

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

+6

因为直到后期才被标准化? – 2013-03-25 12:17:41

+3

'%lf'对'printf'系列没有用处,只适用于'scanf'系列。 – 2013-03-25 12:20:45

+0

可能的重复:http://stackoverflow.com/questions/6395726/how-does-printf-and-co-differentiate-beetween-float-and-double – 2013-03-25 12:22:57

回答

8

根据C90文档:

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

3

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

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

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

相关问题