【问题标题】:`l` length modifier has no effect on a following a, A, e, E, f, F, g, or G conversion specifier`l` 长度修饰符对后面的 a、A、e、E、f、F、g 或 G 转换说明符没有影响
【发布时间】:2015-12-30 11:09:59
【问题描述】:

我正在尝试理解以下section

l (ell)

指定以下diouxX 转换 说明符适用于 longunsigned long 参数;那一个 以下n 转换说明符适用于指向long 的指针 争论;以下c 转换说明符适用于wint_t 争论;后面的s 转换说明符适用于指针 到wchar_t 论点;或对以下aAeEfFgG 转换说明符。

我还可以看到这与cppreference:fprintf 一致,其中"%f""%lf" 等效于printf() 系列。

this answer 是错误的吗?或者C99 是否明确表示"%f" 用于float,而"%lf" 用于double 用于printf() 家庭功能?

【问题讨论】:

  • 如果您继续阅读链接的答案,您将看到为什么printf 格式都适用于double。它与编译器如何将参数传递给可变参数函数有关。

标签: c printf language-lawyer c99 format-specifiers


【解决方案1】:

文档是正确的:printf 认为 floatdouble 之间没有区别。

printf 系列函数的参数通过可变长度机制获取。在可变长度参数列表的可变长度部分,“默认参数提升”适用:类型charshort int 提升为intfloat 提升为double

【讨论】:

    【解决方案2】:

    TL;DR - 您链接的答案非常好。 printf() 中的 %f 可以处理 doublefloat,这两种类型的参数。


    信息: printf()variadic function

    根据C99,第 7.19.6.3 章

    语法

    #include <stdio.h>
    int printf(const char * restrict format, ...);

    关于%f 格式说明符,

    f,F

    表示浮点数的double 参数转换为 [−]ddd.ddd 样式的十进制表示法,其中后面的位数 小数点字符等于精度规范。 [....]

    所以,我们看到,标准只有提到了double。对它的年轻对手感到好奇,float

    然后,从第 §6.5.2.2 章第 7 段开始

    [...] 函数原型声明器中的省略号表示 参数类型转换在最后一个声明的参数之后停止。默认参数 提升是在尾随参数上执行的。

    并且,关于 默认参数提升 部分,(强调我的),第 6 段,

    [...] 如果表示被调用函数的表达式的类型不包含 原型,整数提升在每个参数上执行,和参数 将类型 float 提升为 double。这些被称为默认参数 促销。 [...]

    所以,对于printf() 函数,使用%f 格式说明符,提供的参数是floatdouble 类型都没有关系,无论如何它都会被提升为double

    【讨论】:

      猜你喜欢
      • 2019-12-19
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 2017-05-08
      • 2019-01-07
      • 1970-01-01
      • 2022-11-29
      • 1970-01-01
      相关资源
      最近更新 更多