【问题标题】:1.#QNANO in output in C language?1.#QNANO用C语言输出?
【发布时间】:2017-04-08 22:30:28
【问题描述】:
#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 是什么意思?

【问题讨论】:

  • 附注3.14和-2.71是输入,5.85和-5.85是输入和输出
  • 没有任何输出来自编译器。而且您的代码会调用未定义的行为。为什么你会看到编译器警告?该代码还显示了其他误解。 C 是严格按值传递的!
  • 函数中没有返回值。
  • 你是先用谷歌搜索1.#QNAN 吗? 1.#QNAN error C++,它是 QNAN0,而不是 QNANO 1.#QNAN0 output when calculating standard deviation C
  • 我重新打开了这个问题,因为它被标记为wrong dupe

标签: c pointers return output function-calls


【解决方案1】:

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

因此,等待float%f 不会得到任何值,它将打印#QNAN0,这意味着Not A Number。所以你可以改变你的代码如下:

在您的主目录中:

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

函数中:

void diff_abs(float a, float b) {  //change the return value to void
  //float *pa = &a;   //you are not using this variable
  float *pb = &b;
  float tmp = a;
  a = a-b;
  b = *pb-tmp;
  printf("%.2f\n", a);
  printf("%.2f\n", b);
  return;
}

【讨论】:

  • 很高兴能帮上忙。 @FulvioDenza
【解决方案2】:

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

引用 C11,第 §6.9.1 章,函数定义

如果到达终止函数的},并且函数调用的值被 调用者,行为未定义。

根据您的 cmets,您似乎不需要从该函数获得任何返回值。在这种情况下,

  • 将函数签名更改为返回类型void
  • 只需调用该函数,将main() 中的最后一个printf() 调用完全去掉。被调用函数内的printf()s 将被执行,打印将自行显示,您无需为此将函数作为参数传递给另一个printf()

【讨论】:

  • 我尝试了很多方法,例如我在函数的末尾放了一个返回 0,返回一个 && b,等等,但无论如何终端不会只显示 5.85 和 - 5.85
  • @FulvioDenza 将printf("%f\n", diff_abs(x,y)); 更改为diff_abs(x,y);,我想这就是你所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多