奇怪的printf输出

chi*_*lia 2 c floating-point printf

我执行了以下代码

#include <stdio.h>

int main()
{
    printf("%f\n", 9/5);
}
Run Code Online (Sandbox Code Playgroud)

输出: 0.000000

为什么不1呢?

如果我写 printf("%f %f %d %d\n", (float)9/5, 4, sizeof(float), sizeof(int));

那么输出就是 1.800000 0.000000 4 59

为什么不 1.800000 4 4 4

在我的机器上sizeof (float)4

提前致谢

Mys*_*ial 12

这是因为您的printf格式说明符与您传递的格式说明符不匹配:

9/5是类型的int.但是printf期待一个float.

所以你需要将它转换为浮点数或使文字成为浮点数:

printf("%f\n", (float)9/5);
printf("%f\n", 9./5);
Run Code Online (Sandbox Code Playgroud)

至于你为什么要这样做0.0,那是因为它printf()正在读取1(整数)的二进制表示并将其打印为float.这恰好是一个非常接近的小的非规范化值0.0.

编辑:在varargs上也有类型推广的东西.

在vararg函数中,float被提升为double.所以printf()在这种情况下实际上需要一个64位参数double.但是你只传递了一个32位的操作数,所以它实际上从堆栈中读取了额外的32位(在这种情况下恰好为0) - 甚至更多未定义的行为.