C 为什么从float到double的隐式转换在我的程序中返回一个无意义的数字?

C 为什么从float到double的隐式转换在我的程序中返回一个无意义的数字?,c,casting,integer,double,C,Casting,Integer,Double,我正在为我的C编程入门课做一个实验作业,我们正在学习铸造 作为练习的一部分,我必须编写此程序,并解释每个练习中发生的铸造: #include <stdio.h> int main(void) { int a = 2, b = 3; float f = 2.5; double d = -1.2; int int_result; float real_result; // exercise 1 int_result = a * f; printf("%

我正在为我的C编程入门课做一个实验作业,我们正在学习铸造

作为练习的一部分,我必须编写此程序,并解释每个练习中发生的铸造:

#include <stdio.h>

int main(void)
{
  int a = 2, b = 3;
  float f = 2.5;
  double d = -1.2;
  int int_result;
  float real_result;

  // exercise 1
  int_result = a * f;
  printf("%d\n", int_result);

  // exercise 2
  real_result = a * f;
  printf("%f\n", real_result);

  // exercise 3
  real_result = (float) a * b;
  printf("%f\n", real_result);

  // exercise 4
  d = a + b / a * f;
  printf("%d\n", d);

  // exercise 5
  d = f * b / a + a;
  printf("%d\n", d);

  return 0;
}
对于最后两个输出,执行的数学运算产生浮点值。因为存储它们的变量是double类型,所以从float到double的转换不应该影响值,对吗?但是当我打印出
d
的值时,我会得到输出中显示的垃圾编号

有人能解释一下吗

但是当我打印出d的值时,我得到了输出中显示的垃圾编号

您正在使用
%d
作为格式,而不是
%f
%lf
。当格式说明符和参数类型不匹配时,会出现未定义的行为

%d
接受
int
(并以十进制格式打印)

%f
采用
双精度

%lf
是一个错误(C89)或相当于
%f
(自C99起)

但是当我打印出d的值时,我得到了输出中显示的垃圾编号

您正在使用
%d
作为格式,而不是
%f
%lf
。当格式说明符和参数类型不匹配时,会出现未定义的行为

%d
接受
int
(并以十进制格式打印)

%f
采用
双精度


%lf
是一个错误(C89)或相当于
%f
(自C99起)。

显示代码时,通常应标记代码的语言。我为您添加了
C
标签。哦,对不起,我是新来的。谢谢你的帮助<代码>“%d”
表示整数。打开警告。@hustmphrr否,
double
应使用
%f
。编译时,始终启用所有警告(对于gcc,至少使用:
-Wall-Wextra-pedantic
),然后编译器可以告诉您代码的语法问题。发布的代码引发了两个这样的警告。修复这些警告很可能会修复代码的问题当您显示代码时,通常应该标记代码是什么语言。我为您添加了
C
标签。哦,对不起,我是新来的。谢谢你的帮助<代码>“%d”
表示整数。打开警告。@hustmphrr否,
double
应使用
%f
。编译时,始终启用所有警告(对于gcc,至少使用:
-Wall-Wextra-pedantic
),然后编译器可以告诉您代码的语法问题。发布的代码引发了两个这样的警告。修复这些警告很可能会修复代码的问题
5
5.000000
6.000000
1074921472
1075249152