【问题标题】:C90 doesn't allow %lf use in printf, why?C90 不允许在 printf 中使用 %lf,为什么?
【发布时间】:2013-03-14 22:09:30
【问题描述】:

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

当我使用这段代码时:

#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 中不好?

【问题讨论】:

  • 因为后来才标准化?
  • %lfprintf 家族没有用处,只对scanf 家族有用。
  • 你可能只是混淆了一些东西,double 打印的是%f 而不是%lf

标签: c


【解决方案1】:

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

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

另一方面,C99 表示 l 之前的 f 无效。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 2013-06-26
      • 2013-07-13
      • 1970-01-01
      • 2022-12-10
      • 2011-09-17
      相关资源
      最近更新 更多