为什么scanf()需要“%lf”作为双打,printf()可以用“%f”吗?
为什么scanf()在读取double时需要“ %lf ”中的l ,而printf()可以使用“ %f ”而不pipe其参数是double还是float ? 
示例代码:
 double d; scanf("%lf", &d); printf("%f", d); 
	
 因为C将推动漂浮加倍function,采取可变参数。 指针不会升级为任何东西,所以您应该使用%lf , %lg或%le (或C99中的%la )来读取双精度值。 
 由于С99在C中的格式说明符和浮点参数types之间的匹配在printf和scanf之间是一致的。 它是 
-   %f为float
-   %lf为double
-   %Lflong double
 恰巧,当floattypes的参数作为可变parameter passing时,这样的参数隐式转换为doubletypes。 这就是为什么在printf格式说明符中%f和%lf是等价和可互换的。 在printf你可以用float和%f交叉使用%lf和double 。 
 但是没有理由在实践中真正做到这一点。 不要使用%f来打印doubletypes的参数。  C89 / 90时代是一种普遍的习惯,但这是一个坏习惯。 在printf使用%lf作为double并保留%f为float参数保留。 
  scanf需要知道&d所指向的数据的大小才能正确填充数据,而variadic函数会将浮点数加倍(不完全确定原因),所以printf总是会变成double 。 
因为否则,scanf会认为你正在传递一个指向浮点数的指针,这个浮点数比double小,它会返回一个不正确的值。
在Cexpression式中使用浮点数或双精度值将导致一个双精度值,所以printf无法区分这个差异。 鉴于指向double的指针必须明确地向scanf发送信号,使其不同于指向float的指针,因为指针指向的是什么。