C中的%f和%lf有什么区别?
我在一本C语言书的C示例中看到了这两个参数,但作者没有详细说明这两个参数之间的区别。我知道C中的%f和%lf有什么区别?,c,C,我在一本C语言书的C示例中看到了这两个参数,但作者没有详细说明这两个参数之间的区别。我知道%f指定应该用一个浮点数代替它。我试着查找这个,但很难找到这个w符号。那么%lf呢?简单的回答是,它对printf没有影响,并且表示在scanf中使用float或double 对于printf,类型为float的参数升级为double,因此%f和%lf都用于double。对于scanf,您应该使用%f表示浮动,使用%lf表示双重 关于我们当中的语言律师的更多详情如下: 在printf系列中,%f和%lf之
%f
指定应该用一个浮点数代替它。我试着查找这个,但很难找到这个w符号。那么%lf
呢?简单的回答是,它对printf
没有影响,并且表示在scanf
中使用float
或double
对于printf
,类型为float
的参数升级为double
,因此%f
和%lf
都用于double
。对于scanf
,您应该使用%f
表示浮动
,使用%lf
表示双重
关于我们当中的语言律师的更多详情如下:
在
printf
系列中,%f
和%lf
之间没有区别。ISO C标准(其中的所有引用均来自C11),第7.21.6.1节,fprintf函数
,第/7
段规定了l
修饰符(我的重点):
指定以下d
、i
、o
、u
、x
或x
转换说明符应用于long int
或无符号long int
参数;下面的n
转换说明符应用于指向long int
参数的指针;以下c
转换说明符应用于wint\t
参数;以下s
转换说明符应用于指向wchar\t
参数的指针或对下列a
,a
,e
,e
,f
,f
,g
或g
转换说明符没有影响。
它不需要修改f
说明符的原因是,该说明符已经表示同一节的/8
段中的%f
说明符类型中的double
:
表示浮点数的double
参数转换为十进制表示法
这与函数原型中椭圆后面的参数根据第6.5.2.2节“函数调用”第7段“代码”进行默认参数升级有关:
函数原型声明器中的省略号表示法会导致参数类型转换在最后一个声明的参数之后停止。默认参数升级是对尾部参数执行的
由于printf
(以及整个printf
类函数系列)被声明为int printf(const char*restrict format,…)代码>使用省略号表示法,该规则适用于此处。默认参数提升在第6.5.2.2节函数调用
,第/6
段中介绍:
如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,并且具有类型float
的参数提升为double
。这些被称为默认参数提升。
对于scanf
系列,它要求使用double
而不是float
。第7.21.6.2节fscanf功能/11
指定以下d
、i
、o
、u
、x
、x
或n
转换说明符应用于类型指针指向long int
或无符号long int
的参数以下a
、a
、e
、e
、f
、f
、g
转换说明符应用于类型指针指向double
的参数或以下c
、s
或[
转换说明符应用于类型指针指向wchar\t
的参数
这修改了该节的/12
段,该段规定,对于%f
:
匹配可选有符号浮点数、无穷大或NaN
,其格式与strod
函数的主题序列的预期格式相同。相应的参数应为指向浮点的指针
对于scanf
,%f
读入float
,而%lf
读入double
对于printf
:在C99和更高版本中,它们都是相同的,并且它们要么打印float
,要么打印double
。在C89中,%lf
导致未定义的行为,尽管将其视为%f
是一种常见的扩展
在printf
中,一个说明符可以用于两种不同的类型,这是因为默认的参数提升;类型为float
的参数在用于调用函数且与函数原型中的参数不匹配时被提升为double
。因此printf
只看到一个double
在这两种情况下,printf()会优雅地忽略%lf中的宽度修饰符或者,更准确地说,%f采用双精度-varargs将始终将浮点参数提升为双精度。对于使用printf系列函数的输出,%f和%lf说明符的含义相同;l被忽略。两者都需要双精度类型的对应参数-但浮点类型的参数被提升为双精度,这就是re对于类型float没有单独的说明符(此提升仅适用于变量函数,如printf和未声明原型的函数,一般不适用于函数调用)