为了账号安全,请及时绑定邮箱和手机立即绑定

正确的双打印格式说明符

正确的双打印格式说明符

C
幕布斯6054654 2019-06-27 16:39:41
正确的双打印格式说明符正确的格式说明符是什么?double打印出来的?是吗%f或者是%lf?我相信这是.%f但我不确定。代码样本#include <stdio.h>int main(){    double d = 1.4;    printf("%lf", d); // Is this wrong?}
查看完整描述

3 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

"%f"是(或至少一种)正确的双倍格式。那里没有格式的float,因为如果您试图传递floatprintf,它将被提升为double以前printf收到它1"%lf"在现行标准下也是可以接受的-l如果后面跟着f转换说明符(除其他外)。

请注意,这是一个地方,printf格式字符串与scanf(和fscanf等等)格式化字符串。为了输出,您将传递一个价值,将从floatdouble当作为变量参数传递时。对于输入,您将传递一个指针,没有晋升,所以你必须告诉scanf不管你是否想读float或者是double所以scanf%f意味着你想读一个float%lf意味着你想读一个double(不管它值多少钱,对于一个long double,你用%Lf任一种printfscanf).


1.C99,§6.5.2.2/6:“如果表示被调用函数的表达式的类型不包括原型,则对每个参数执行整数提升,并将具有浮动类型的参数提升为双倍。这称为默认参数提升。”在C+中,措辞有些不同(例如,它没有使用“Prototype”一词),但效果是一样的:所有变量参数在被函数接收之前都会经历默认的升级。


查看完整回答
反对 回复 2019-06-27
?
MMTTMM

TA贡献1869条经验 获得超4个赞

鉴于C99标准(即N 1256),规则取决于函数类型:fprintf(printf,sprintf,.)或者扫描。

以下是提取的相关部分:

前言

第二版取消并取代第一版ISO/IEC 9899:1990,经ISO/IEC 9899/COR1:1994、ISO/IEC 9899/AMD 1:1995和ISO/IEC 9899/COR2:1996修订和更正。与上一版相比的主要变化包括:

  • %lf

    允许转换说明符

    printf

7.19.6.1fprintf功能

7长度修饰语及其含义如下:

l(Ell)指定(.)对下列a,A,e,E,f,F,g或G转换说明符没有影响。

L指定以下a、A、e、E、f、F、g或G转换说明符适用于长双参数。

指定的相同规则fprintf申请printfsprintf以及类似的功能。

7.19.6.2fscanf功能

11长度修饰语及其含义如下:

l(Ell)指定(.)以下a,A,e,E,f,F,g或G转换说明符适用于类型指针为Double的参数;

L指定以下a、A、e、E、f、F、g或G转换说明符应用于类型指针为Long Double的参数。

12转换说明符及其含义是:a,e,f,g匹配可选符号浮点数,(.)

14转换说明符A、E、F、G和X也是有效的,其行为分别与a、e、f、g和x相同。

长话短说fprintf指定了下列说明符和相应类型:

  • %f

    ->双倍
  • %Lf

    ->长双人间

而为了fscanf它是:

  • %f

    ->浮动
  • %lf

    ->双倍
  • %Lf

    ->长双人间


查看完整回答
反对 回复 2019-06-27
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

可能是%f%g%e取决于您希望对数字进行格式化的方式。这个l修饰符在scanf带着double,但不是在printf.


查看完整回答
反对 回复 2019-06-27
  • 3 回答
  • 0 关注
  • 367 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信