“%lf”占位符的含义

时间:2016-01-21 08:38:06

标签: c

这是我的小程序,我专心地将占位符%lf放在第二个printf中。为什么第二个printf与第一个printf具有相同的结果(printf 1.3)。

int main()
{
    double f = 1.3;
    long l = 1024L;

    printf("f = %lf", f);
    printf("l = %lf", l);
    return 0;
}

3 个答案:

答案 0 :(得分:2)

Undefined behaviour如果printf()格式说明符不匹配,则为C11, 7.21.6.1 The fprintf function%lf需要double,但您传递的是long int

{{3}}

  

9如果转换规范无效,则行为为   undefined.282)如果任何参数不是正确的类型   相应的转换规范,行为未定义。

那就是说,可能会发生的事情是,当你第一次调用printf()时,f的值会在浮点寄存器中或在堆栈中的位置传递给double。下次调用p rintf()时,由于格式说明符%lf,它会从相同的位置读取。而不是从存储l的值的位置读取。如果交换printf()调用的顺序,您可能会观察到不同的输出。但这是所有平台特定的。一旦您的程序调用未定义的行为,任何事情都可能发生。基本上,你不能期望它做任何明智的事情,并且绝对不保证它的行为。

答案 1 :(得分:0)

你有一个说明符不匹配。值

long l = 1024L;

被解释为双重;这恰好大约是1.3(至少在你和我的电脑上。我认为这在不同的架构上可能会有所不同;取决于“长”和“双”的长度,以及它们如何在内部表示。

对于%lf占位符的含义,您可以在printf documentation中看到%f表示:十进制浮点数l长度修饰符对%f说明符具有影响。

结论:%lf = %f = 十进制浮点

答案 2 :(得分:0)

此处如果您将代码更改为:

#include <stdio.h>

int main()
{
    double f = 1.3;
    long l = 1024L;

    printf("f = %lf", f);
    printf("l = %lf", (float)l);
    return 0;
}

你会看到输出会有所不同。当你传递一个long来呈现为double时,你应该期待未定义的行为