printf中double的正确格式说明符是什么?是%f还是%lf?我想是%f,但我不确定.

代码示例

#include <stdio.h>

int main()
{
   double d = 1.4;
   printf("%lf", d); // Is this wrong?
}

推荐答案

"%f"是(或至少一个)正确的双精度格式.float没有格式,因为如果你试图把float传给printf,在printf收到它之前,它会被提升到double."%lf"在当前标准下也是可以接受的——l后面跟f转换说明符(除其他外),则被指定为无效.

请注意,这是一个printf个格式字符串与scanf个(和fscanf等)格式字符串有很大不同的地方.对于输出,传递value,当作为可变参数传递时,它将从float提升到double.对于输入,你要通过pointer,这不是提升,所以你必须告诉scanf你是想读float还是double,所以对于scanf%f意味着你想读float%lf意味着你想读double(无论如何,对于long double,你用%Lf代表printfscanf).


1.C99,§6.5.2.2/6:"如果表示被调用函数的表达式的类型不包含原型,则对每个参数执行整数提升,将类型为FLOAT的参数提升为双精度,这称为默认参数提升."在C++中,措辞略有不同(例如,它没有使用单词"Prototype"),但效果是相同的:所有可变参数在被函数接收之前都经历了默认提升.

C++相关问答推荐

如何将一个enum类型类型转换为另一个类型?

ISO_C_BINDING,从Fortran调用C

在C语言中使用scanf()时我无法理解的警告

Malloc(sizeof(char[Length]))是否不正确?

为什么在此程序中必须使用Volatile关键字?

C语言编译阶段与翻译阶段的关系

判断X宏的空性

cairo 剪辑区域是否存在多个矩形?

如何在C++中安全地进行浮点运算

Tic-tac-toe:从文件加载存储

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

初始成员、公共初始序列、匿名联合和严格别名如何在C中交互?

C程序向服务器发送TCPRST

在C中使用无符号整数模拟有符号整数

C中的char**v*char[]

在C中打印指针本身

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

模仿 memmove 的行为

将指针的地址加载到寄存器内联拇指组件中

如何正确探测平台设备?