使用 printf 时 %f 和 %lf 可以互换吗?

Ani*_*Sen 3 c double printf floating conversion-specifier

在 w3resource.com 上的一篇文章中,我看到了以下代码:

double x, y;
pr1 = sqrt(pr1);
x = (-b + pr1)/(2*a);
y = (-b - pr1)/(2*a);
printf("Root1 = %.5lf\n", x);
printf("Root1 = %.5lf\n", y);
Run Code Online (Sandbox Code Playgroud)

文章说取三个浮点数。但在他们的解决方案(此代码片段)中,他们使用了%lf格式说明符。他们为什么使用%lf而不是%f?我也可以使用%f代替%lf浮点数吗?

如果我使用float关键字代替double, 并使用%f, 有什么问题吗?输出对我来说是一样的。

Jan*_*tke 6

%fprintf在家庭功能中具有不同的含义scanf

  • in printf%f%lf是等价的,并且两者都由 匹配double。这是因为在可变参数函数中,所有float参数都会在调用函数时提升,因此在语言级别传递和double传递之间没有区别。floatdouble
  • scanf,%f匹配 afloat*%lf匹配 a double*,这个区别非常重要。使用错误类型的指针将导致未定义的行为。

还可以使用cdecl+来更好的理解printfscanf调用。输出如下:

printf("Root1 = %.5lf\n", x)
Run Code Online (Sandbox Code Playgroud)
Write "Root1 = "
Write a decimal double with lower-case infinity/NaN symbols
    precision: 5
Write "\n"

ARGUMENTS & EXPECTED TYPES
--------------------------
x (double)
Run Code Online (Sandbox Code Playgroud)

如有疑问,请使用%fforfloat%lffor double,即使在 中printf,两者之间没有区别。scanf否则,您将在您的字符串和格式字符串之间引入毫无意义的不一致printf

关于浮点数的注意事项

float您可能对和浮点数的含义感到困惑。 floatdoublelong double、 more 是C 语言中的浮点数。当文章中提到浮点数时,它们也可能表示double_Decimal32_Float128等。

为什么不scanf提升float*double*类似printf

这是不可能的,因为我们存储的对象float不能用于存储double.

  • 在语言级别,这将是严格的别名违规
  • 在实现级别,我们会尝试将例如八个字节存储在由四个字节组成的doublea中,这是不可能的。float