[英]Scanf/Printf double variable C
假设我在C中有以下代码:
double var;
scanf("%lf", &var);
printf("%lf", var);
printf("%f", var);
它从stdin变量'var'读取,然后在stdout'var'中打印两次。 我理解你是如何从stdin读取双变量的,但我的问题是:
对于像printf
和scanf
这样的变量参数函数,会提升参数,例如,任何较小的整数类型都会提升为int
, float
会提升为double
。
scanf
接受指针参数,因此促销规则不起作用。 它必须使用%f
表示float*
, %lf
表示double*
。
printf
永远不会看到float
参数, float
总是被提升为double
。 格式说明符是%f
。 但是C99还说%lf
与printf
%f
相同:
C99§7.19.6.1的
fprintf
功能
l
(ell)指定以下d
,i
,o
,u
,x
或X
转换说明符适用于long int
或unsigned long int
参数; 以下n
转换说明符适用于指向long int
参数的指针; 以下c
转换说明符适用于wint_t
参数; 以下s
转换说明符适用于指向wchar_t
参数的指针; 或对后续的a
,A
,e
,E
,f
,F
,g
或G
转换说明符没有影响。
当float
传递给printf
,它会自动转换为double
。 这是默认参数提升的一部分,它适用于具有可变参数列表(包含...
)的函数,主要是出于历史原因。 因此, float
的“自然”说明符%f
必须使用double
参数。 所以printf
的%f
和%lf
说明符是相同的; 他们都采取double
价值。
调用scanf
,会传递指针,而不是直接值。 指向float
的指针不会转换为指向double
的指针(由于指向对象在更改指针类型时无法更改,因此无法工作)。 因此,对于scanf
, %f
的参数必须是指向float
的指针,而%lf
的参数必须是指向double
的指针。
至于我阅读手册页,scanf说'l'长度修饰符指示(在浮点的情况下)参数是double类型而不是float类型,所以你可以有'lf,le,lg'。
至于打印,正式,手册说'l'仅适用于整数类型。 因此,某些系统或某些标准可能不支持它。 例如,在使用gcc -Wall -Wextra -pedantic
编译时,我收到以下错误消息
a.c:6:1: warning: ISO C90 does not support the ‘%lf’ gnu_printf format [-Wformat=]
因此,如果您的标准支持语法,您可能需要重新检查。
总而言之,我会说你用'%lf'阅读并用'%f'打印。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.