Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的%f和%lf有什么区别?_C - Fatal编程技术网

C中的%f和%lf有什么区别?

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之

我在一本C语言书的C示例中看到了这两个参数,但作者没有详细说明这两个参数之间的区别。我知道
%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和未声明原型的函数,一般不适用于函数调用)