C 语言 printf("%f\n",3/2) 为什么结果是 0 ?

关注者
200
被浏览
195,077

42 个回答

简单的说:3/2是整数,而printf后面的可变参数,没有类型指定,不会做隐式类型转换。

在大多数其他场合,浮点数跟整数是被编译器自动进行类型转换的,不用担心这种问题。例如,函数声明需要一个浮点数,给一个整数,编译器会进行隐式类型转换,使得实际行为符合预期。

然而,printf后面的可变参数没有(编译期)类型声明,也就不会去做类型转换,你给的是整数,那么就会当做整数。整数的存储格式与浮点不同,因此这里,把整数当作浮点输出,实际结果未定义。

至于为什么3/2是整数,你得查查C语言语法,就理解了。

所以:为什么结果是0?因为此处为未定义行为,结果可能为任意值。

编译器其实已经给做了提示的

#include "stdio.h"
int main()
    printf("%f\n",3/2);
    return 0;
}

使用gcc编译

gcc float.c && ./a.out
float.c: In function ‘main’:
float.c:5:14: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat=]
     printf("%f\n",3/2);
0.000000


3是整型吧,2是整型吧,3/2默认就是整型了。

3/2 取整型,那就是1,但是1用 %f 输出的时候,就会出现是 0 。

#include "stdio.h"
int main()
    printf("%f\n",1);
    return 0;
}

编译输出

gcc float.c && ./a.out
float.c: In function ‘main’:
float.c:5:14: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat=]
     printf("%f\n",1);
0.000000


编译的时候,也提示了,需要使用 %d 输出。

如果我们修改成这样,就会得到我们想到的了。


#include "stdio.h"