在printf中使用%d来打印浮点值会产生意外的输出

时间:2016-11-06 14:56:12

标签: c types casting int

#include<iostream>
#include<stdio.h.>
using namespace std;
int main()
{
    float f=11.11;
    printf("%d",f);
}

当我在dev c ++中执行以下代码时,它给出输出-536870912。 当我在在线教程上执行相同的代码时,点编译器在每次运行时都会有所不同。背后的原因是什么?

4 个答案:

答案 0 :(得分:3)

如果参数与格式说明符不匹配,则为undefined behaviour。 Ue %f打印浮动。

printf("%f",f);

您应该能够使用优秀的编译器轻松捕获这些错误。 GCC产生:

warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=]

代码。

P.S。:stdio.h标题中包含一个迷路点。

答案 1 :(得分:2)

我不确定您是否要求为什么不打印11?为什么在不同的编译器下打印不同的答案?

它没有打印11的原因是,正如其他答案所解释的那样,%d没有打印浮点数,而在printf次调用中没有自动转换来修复传递和预期类型之间的不匹配。

它在不同编译器下打印不同内容的原因是它的未定义行为,这意味着任何事情都可能发生。假设你去车上,松开前轮上的所有螺母,直到它即将脱落,进入并高速行驶,直到车轮 坠落然后,你失去控制并撞到沟里。并且假设你有一辆新车明天会做同样的事情,除非你偶然撞到一棵树上。此时,您可以采取两种方法:

  1. 试着找出导致你在一天撞到沟里的微妙因素,以及另一天撞到一棵树的细微因素。为什么它不可重复?
  2. 决心不再尝试这样的愚蠢实验。

答案 2 :(得分:1)

这是一个浮动,使用

printf("%f" , f); 

如果你不这样做是一种未定义的行为。 要理解,您可以尝试将值为-1的int转换为unsigned int。

你将获得巨大的价值。

答案 3 :(得分:1)

转换说明符与变量类型之间存在不匹配:

hasOwnProperty

传递给 printf("%d",f); 其他参数然后由格式字符串给出的转换说明符指定引发未定义的行为。从那一刻起,一切都会发生。

要解决此问题,请使用正确的转换说明符。

对于浮点变量,请使用转换说明符printf,它需要f。但是,当double传递给float等可变函数时,printf会被提升为float