c - "%lf"占位符的含义

标签 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;
}

最佳答案

这是 Undefined behaviour如果 printf() 格式说明符不匹配。 %lf 需要一个 double,但您传递的是一个 long int

C11, 7.21.6.1 The fprintf function

9 If a conversion specification is invalid, the behavior is undefined.282) If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

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

关于c - "%lf"占位符的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34918890/

相关文章:

c - 检查目录时出现指针问题

c - 寻找中点ADT

c - 制作驱动程序时禁用 KBUILD_CFLAGS 选项

未为多个定义生成编译器警告

c++ - GCC '-g' 选项有什么作用?

c - 从 func() 到 __func() 的间接寻址

c++ - 使用 ReadFile 对内存位置的访问无效

c - 没有找到二进制文件 Eclipse

c - 与 ld/gcc 链接不会产生相同的结果(错误/成功)

从 int 转换为(16 位)__m128i