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

Use of %d inside printf to print float value gives unexpected output

1
2
3
4
5
6
7
8
#include<iostream>
#include<stdio.h.>
using namespace std;
int main()
{
    float f=11.11;
    printf("%d",f);
}

当我在dev c中执行以下代码时,其输出为-536870912。
当我在在线教程点编译器上执行相同的代码时,每次运行都会得到不同的结果。可能是什么原因造成的?


如果参数与格式说明符不匹配,则它是未定义的行为。 Ue %f以打印浮点数。

1
printf("%f",f);

使用良好的编译器,您应该可以轻松捕获此类错误。 GCC产生:

1
warning: format a€?%da€? expects argument of type a€?inta€?, but argument 2 has type a€?doublea€? [-Wformat=]

输入您的代码。

P.S .: stdio.h标头包含一个散点。


我不确定您是否在问为什么它没有打印11?还是为什么在不同的编译器下会打印出不同的答案?。

不打印11的原因是,正如其他答案所解释的那样,%d不打印浮点数,并且在printf调用中没有自动转换来解决传递的和预期的不匹配问题。类型。

它在不同的编译器下打印不同内容的原因是它的不确定行为,意味着任何事情都可能发生。假设您出门开车,松开前轮上的所有螺母,直到快要掉下来,上车,然后沿着高速行驶,直到车轮掉下,这时您就会失去控制并坠毁陷入沟中。并且假设您明天会买一辆新车,做完全一样的事情,除了偶然地撞倒在一棵树上。此时,您可以采用两种方法:

  • 尝试找出是什么细微的因素导致您在一天之内掉进沟渠,而在另一天又掉进一棵树。为什么它不具有更高的可重复性?
  • 下定决心不要再尝试这种愚蠢的实验。

  • 此处的转换说明符与变量类型不匹配:

    1
      printf("%d",f);

    传递给printf其他参数,然后由格式字符串给定的转换说明符指定这些参数会引起不确定的行为。从那一刻起,一切都会发生。

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

    对于浮点变量,请使用转换说明符f,该转换说明符应为double。但是,当将float传递给像printf这样的可变参数时,float会被提升为double


    这是一个浮点数,请使用

    1
    printf("%f" , f);

    如果不这样做,则是不确定的行为。
    要理解,可以尝试将值-1的int强制转换为无符号int。

    您将获得巨大的价值。