使用%d insde printf打印浮点值会产生意外输出
#include #include using namespace std; int main() { float f=11.11; printf("%d",f); }
当我在dev c ++中执行以下代码时,它给出输出-536870912。 当我在在线教程上执行相同的代码时,点编译器在每次运行时都会有所不同。 背后的原因是什么?
这是一个浮动,使用
printf("%f" , f);
如果你不这样做是一种未定义的行为。 要理解,您可以尝试将值为-1的int转换为unsigned int。
你将获得巨大的价值。
如果参数与格式说明符不匹配,则它是未定义的行为 。 Ue %f
打印浮动。
printf("%f",f);
您应该能够使用优秀的编译器轻松捕获这些错误。 GCC生产:
warning: format '%d' expects argument of type 'int', but argument 2 has type 'double' [-Wformat=]
为了你的代码。
PS:你的stdio.h
头文件中有一个杂点。
我不确定你是否在问为什么不打印11? 或者为什么在不同的编译器下打印不同的答案? 。
它没有打印11的原因是,正如其他答案所解释的那样, %d
不会打印浮点数,而在printf
调用中,没有自动转换来修复传递类型和期望类型之间的不匹配。
它在不同编译器下打印不同内容的原因是它是未定义的行为 ,意味着任何事情都可能发生。 假设你出去你的车,松开前轮上的所有螺母,直到它即将脱落,进入,然后高速行驶,直到车轮脱落,于是你失去控制并撞到沟里。 并且假设你得到一辆新车并明天做同样的事情,除了你偶然撞到一棵树。 此时,您可以采取两种方法:
- 试着找出导致你在一天撞到沟里的微妙因素,以及另一天撞到一棵树的细微因素。 为什么它不可重复?
- 决心不再尝试这样的愚蠢实验。
转换说明符与变量类型之间存在不匹配:
printf("%d",f);
传递给printf
其他参数然后由格式字符串给出的转换说明符指定引起未定义的行为。 从那一刻开始,一切都会发生。
要解决此问题,请使用正确的转换说明符。
对于浮点变量,使用转换说明符f
,它需要一个double
。 但是当float
被传递给像printf
这样的可变函数时, float
会被提升为double
。