[英]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程序,應將其保留在變量ab中,並將其保留在b變量ba中。 沒關系,但是如果我在輸出末尾運行我的代碼,編譯器會顯示以下消息:
3.14
-2.71
5.85
-5.85
1.#QNAN0
1.#QNANO是什么意思?
問題是,您沒有從調用的函數diff_abs()
return
值, diff_abs()
嘗試使用return
-ed值。 它調用未定義的行為 。
引用C11
,第§6.9.1章, 函數定義
如果到達終止函數的
}
,並且調用者使用了函數調用的值,則該行為未定義。
根據您的注釋,似乎不需要該函數具有任何返回值。 在這種情況下,
void
printf()
中調用main()
完全。 調用的函數中的printf()
會被執行,並且打印將單獨顯示,您無需為此將該函數作為參數傳遞給另一個printf()
。 在這段代碼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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.