这是我的小程序,我特意将占位符 %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/