我在那里。
我正在学习C,我有这段代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
double buyval, deliveredval, change;
printf("What's the buy value? ");
scanf("%lf", &buyval);
do{
printf("What's the value delivered? ");
scanf("%lf", &deliveredval);
if (deliveredval < buyval){
printf("Delivered value must be greater then buy value \n\n");
}
} while (deliveredval < buyval);
change = deliveredval - buyval;
printf("Change is %4.2lf", change);
return 0;
}
使用此代码,最后一次打印始终为0.00但是我更改了
printf("Change is %4.2lf", change);
到
printf("Change is %4.2f", change);
它按预期工作。这是为什么?双打未格式化为lf?
答案 0 :(得分:5)
"%f"
适用于double
s(和float
s,它们会自动转换为double
; %Lf
用于long double
。
您可以在printf
(或C99 Standard)中阅读有关PDF说明符的所有内容。
格式说明符l
中的"%lf"
无效:"%lf"
(与"%f"
相同)是打印double
s。
您的结果应与任何理智的C99编译器/实现相同。
根据我的文件,在C89中,"%lf"
是无效的格式说明符;如果您使用的是C89编译器/实现,则使用它是未定义的行为。
请注意scanf
的规则略有不同。
答案 1 :(得分:3)
在变量参数列表中,float
值会自动转换为double
; char
和short
到int
。因此,printf
只需要%f
double
值(浮点值转换为)。
指针未被转换 - 这没有多大意义。这就是为什么scanf
需要区分%f
目标float
和%lf
double
目标的原因。
答案 2 :(得分:-1)
您应该使用%f
来打印双打。 %lf
只适用于长双打。