为什么读取 a时scanf()
需要l
in " ",而不管它的参数是 a还是 a ,什么时候可以使用 " " ?%lf
double
printf()
%f
double
float
示例代码:
double d;
scanf("%lf", &d);
printf("%f", d);
为什么读取 a时scanf()
需要l
in " ",而不管它的参数是 a还是 a ,什么时候可以使用 " " ?%lf
double
printf()
%f
double
float
示例代码:
double d;
scanf("%lf", &d);
printf("%f", d);
因为对于采用可变参数的函数,C 会将浮点数提升为双精度数。指针不会被提升为任何东西,因此您应该使用%lf
,%lg
或%le
(或%la
在 C99 中)来读取双精度数。
自 С99 以来,格式说明符和 C 中的浮点参数类型之间的匹配在 和 之间是一致printf
的scanf
。这是
%f
为了float
%lf
为了double
%Lf
为了long double
碰巧当 typefloat
的参数作为可变参数传递时,这些参数被隐式转换为 type double
。这就是为什么在printf
格式说明符中%f
和%lf
是等价的和可互换的。在printf
你可以“交叉%lf
使用”float
或%f
。double
但实际上没有理由在实践中这样做。不要使用类型%f
的参数。这是在 C89/90 时代诞生的普遍习惯,但它是一个坏习惯。在for中使用并为参数保留保留。printf
double
%lf
printf
double
%f
float
scanf
需要知道指向的数据的大小&d
才能正确填充它,而可变参数函数将浮点数提升为双精度数(不完全确定为什么),所以printf
总是得到一个double
.
因为否则 scanf 会认为您正在传递一个指向比双精度更小的浮点数的指针,并且它将返回不正确的值。
在 C 表达式中使用 float 或 double 值将导致一个 double 值,因此 printf 无法区分。而指向 double 的指针必须显式地向 scanf 发出信号,与指向 float 的指针不同,因为指针指向的才是最重要的。