printf如何处理float参数与处理double参数的方式完全相同?

直到最近,我才想到:

  • printf("%f",x)将尝试从堆栈中读取4字节的浮点值。

  • printf("%lf",x)将尝试从堆栈中读取8字节的浮点值。

但是,下面的代码似乎产生了正确的输出:

 float f = 1234.5; double d = 12345678.9; printf("Output = %u %u\n",sizeof(f),sizeof(d)); // Output = 4 8 printf("Output = %.1f %.1f\n",f,d); // Output = 1234.5 12345678.9 

我相信它certificateprintf("%f",x)从堆栈中读取一个8字节的浮点值。

这是因为两个值都正确打印,但12345678.9太大而无法放入4字节变量。

现在我的问题是:当使用4字节float变量调用printf时,编译器如何知道它应该在将其推入堆栈并调用printf之前将其转换为8字节的double值?

在调用带浮点参数的函数时,这是标准的一部分吗?

谢谢

编译器如何知道在将其推入堆栈并调用printf之前应将其转换为8字节的double值?

它不必知道何时这样做 – 它总是这样做; 它是默认参数促销的一部分。

在调用带浮点参数的函数时,这是标准的一部分吗?

不,只是变量的。