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

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

为什么scanf()需要l在“%lf“当阅读double,何时printf()可以使用“%f“无论其论点是否为double或者是float?

示例代码:

double d;scanf("%lf", &d);printf("%f", d);


潇湘沐
浏览 558回答 3
3回答

慕森王

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

一只萌萌小番薯

自С99以来,C中格式说明符和浮点参数类型之间的匹配是一致的。printf和scanf..它是%f为float%lf为double%Lf为long double只是碰巧当类型的参数float作为变量参数传递,这些参数将隐式转换为double..这就是为什么printf格式说明符%f和%lf是等价的和可互换的。在……里面printf你可以“交叉使用”%lf带着float或%f带着double.但没有理由在实践中真正做到这一点。不要用%f到printf类型参数double..这是一个广泛的习惯诞生于C89/90时代,但它是一个坏习惯。使用%lf在……里面printf为double并保持%f预留给float争论。

红颜莎娜

scanf需要知道所指向的数据的大小。&d为了正确地填充它,而各种函数促进浮点数加倍(不完全确定原因),所以printf总是得到一个double.
打开App,查看更多内容
随时随地看视频慕课网APP