为了账号安全,请及时绑定邮箱和手机立即绑定

当printf()只对“%f”表示满意时,为什么scanf()在双倍时需要“%lf”?

当printf()只对“%f”表示满意时,为什么scanf()在双倍时需要“%lf”?

C
潇湘沐 2019-06-26 15:55:39
当printf()只对“%f”表示满意时,为什么scanf()在双倍时需要“%lf”?为什么scanf()需要l在“%lf“当阅读double,何时printf()可以使用“%f“无论其论点是否为double或者是float?示例代码:double d;scanf("%lf", &d);printf("%f", d);
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

因为对于带有变量参数的函数,C会将浮点数提升到双倍。指针没有提升到任何东西,所以您应该使用%lf%lg%le(或%la在C99)读成双倍。


查看完整回答
反对 回复 2019-06-26
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

自С99以来,C中格式说明符和浮点参数类型之间的匹配是一致的。printfscanf..它是

  • %f

    float

  • %lf

    double

  • %Lf

    long double

只是碰巧当类型的参数float作为变量参数传递,这些参数将隐式转换为double..这就是为什么printf格式说明符%f%lf是等价的和可互换的。在……里面printf你可以“交叉使用”%lf带着float%f带着double.

但没有理由在实践中真正做到这一点。不要用%fprintf类型参数double..这是一个广泛的习惯诞生于C89/90时代,但它是一个坏习惯。使用%lf在……里面printfdouble并保持%f预留给float争论。


查看完整回答
反对 回复 2019-06-26
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

scanf需要知道所指向的数据的大小。&d为了正确地填充它,而各种函数促进浮点数加倍(不完全确定原因),所以printf总是得到一个double.


查看完整回答
反对 回复 2019-06-26
  • 3 回答
  • 0 关注
  • 557 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信