1.#CNANO用C语言输出?

时间:2016-11-24 14:56:13

标签: c pointers return output function-calls

#include <stdio.h>

float diff_abs(float,float);

int main() {
  float x;
  float y;
  scanf("%f", &x);
  scanf("%f", &y);
  printf("%f\n", diff_abs(x,y));
  return 0;
}

float diff_abs(float a, float b) {
  float *pa = &a;
  float *pb = &b;
  float tmp = a;
  a = a-b;
  b = *pb-tmp;
  printf("%.2f\n", a);
  printf("%.2f\n", b);
}

大家好,我正在做一个C程序,它应该保存在变量a-b和b变量b-a中。 一切都好,但是如果我在输出结束时运行我的代码,编译器会向我显示以下消息:

3.14
-2.71
5.85
-5.85
1.#QNAN0

意味着什么1.#QNANO?

2 个答案:

答案 0 :(得分:1)

问题是,您没有return来自被调用函数diff_abs()的值,而您尝试使用return - ed值。它调用undefined behavior

引用C11,章节§6.9.1,功能定义

  

如果到达了终止函数的},则使用函数调用的值   调用者,行为未定义。

根据您的评论显示,您不需要从该功能获得任何返回值。在那种情况下,

  • 将函数签名更改为返回类型void
  • 只需调用该函数,即可完全删除printf()中的最后一次main()调用。被调用函数内的printf()将被执行,打印件将自行显示,您不需要将该函数作为参数传递给另一个printf()

答案 1 :(得分:1)

在这段代码printf("%f\n", diff_abs(x,y))中,您告诉编译器打印float类型的变量,该变量应该是函数diff_abs的返回值。但是在你的函数diff_abs中,你没有返回任何值。

等待%f的{​​{1}}因此不会获得任何值,它会打印float,这意味着#QNAN0。因此,您可以按如下方式更改代码:

在您的主页:

Not A Number

在功能中:

//printf("%f\n", diff_abs(x,y));   //comment this line
diff_abs(x,y);  //just call the function