1.#QNANO在C语言输出中?
1.#QNANO in output in C language?
#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 是什么意思?
问题是,您没有 return
来自被调用函数 diff_abs()
的值,而您正在尝试使用 return
编辑的值。它调用 undefined behavior.
引用 C11
,章节 §6.9.1,函数定义
If the }
that terminates a function is reached, and the value of the function call is used by
the caller, the behavior is undefined.
根据您的评论,您似乎不需要从函数中获得任何 return 值。那样的话,
- 将函数签名更改为 return 类型
void
- 只需调用该函数,完全删除
main()
中的最后一个 printf()
调用。被调用函数内的 printf()
s 将被执行并且打印将自行显示,为此您不需要将函数作为参数传递给另一个 printf()
。
在这段代码 printf("%f\n", diff_abs(x,y))
中,您告诉编译器打印一个 float
类型的变量,它应该是函数 diff_abs
的 return 值。但是在你的函数 diff_abs
中你没有 returning 任何值。
所以等待 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;
}
#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 是什么意思?
问题是,您没有 return
来自被调用函数 diff_abs()
的值,而您正在尝试使用 return
编辑的值。它调用 undefined behavior.
引用 C11
,章节 §6.9.1,函数定义
If the
}
that terminates a function is reached, and the value of the function call is used by the caller, the behavior is undefined.
根据您的评论,您似乎不需要从函数中获得任何 return 值。那样的话,
- 将函数签名更改为 return 类型
void
- 只需调用该函数,完全删除
main()
中的最后一个printf()
调用。被调用函数内的printf()
s 将被执行并且打印将自行显示,为此您不需要将函数作为参数传递给另一个printf()
。
在这段代码 printf("%f\n", diff_abs(x,y))
中,您告诉编译器打印一个 float
类型的变量,它应该是函数 diff_abs
的 return 值。但是在你的函数 diff_abs
中你没有 returning 任何值。
所以等待 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;
}