gcc中的printf错误结果
案例1:gcc中的printf错误结果,c,gcc,floating-point,C,Gcc,Floating Point,案例1: printf(“%f”,7/2))为0.000000 案例2: float k=7/2 printf(“%f”,k)为3.000000 在第一种情况下,printf期望float,但得到整数,因此给出错误的结果。但在第二种情况下,它进行类型转换 以下是我的问题- 为什么gcc在第一种情况下不给出类型不匹配错误/警告 在第二种情况下,它默认进行类型转换,但在第一种情况下为什么不呢 在第二种情况下,它默认进行类型转换,但在第一种情况下为什么不呢 在第一种情况下,7和2都是int类型。将7除
printf(“%f”,7/2))为0.000000
案例2:
float k=7/2代码>
printf(“%f”,k)为3.000000
在第一种情况下,printf期望float,但得到整数,因此给出错误的结果。但在第二种情况下,它进行类型转换
以下是我的问题-
为什么gcc在第一种情况下不给出类型不匹配错误/警告
在第二种情况下,它默认进行类型转换,但在第一种情况下为什么不呢
在第二种情况下,它默认进行类型转换,但在第一种情况下为什么不呢
在第一种情况下,7
和2
都是int
类型。将7
除以2
将得到int
。使用%f
打印它将调用未定义的行为。你会得到任何东西。在这种情况下,没有类型转换
试试这个
printf("%f", (7.0/2));
在第二种情况下,k
是float
类型,因此默认情况下,7/2
的结果转换为k
类型
为什么gcc在第一种情况下不给出类型不匹配错误/警告
使用-Wall
标志编译第一条语句会发出警告:
[Warning] format '%f' expects argument of type 'double', but argument 2 has type 'int' [-Wformat=]
1) 默认情况下,gcc不会检查带有参数的格式字符串中的类型,因此它会在运行时将数据(即整数)解释为float
2) gcc现在在运行时将浮点解释为浮点。gcc可以发出警告,但您没有启用它。尝试使用flag-Wall
编译,您将看到:
warning: double format, different type arg (arg 2)