爲什麼輸出是給3,期待-3。如何在c中處理這樣的預處理?c代碼的輸出
#include<stdio.h>
#include<math.h>
#define sq(x) ((x<0)?sqrt(-x):sqrt(x))
int main()
{
int x;
x=sq(-9);
printf("%d\n",x);
return 0;
}
爲什麼輸出是給3,期待-3。如何在c中處理這樣的預處理?c代碼的輸出
#include<stdio.h>
#include<math.h>
#define sq(x) ((x<0)?sqrt(-x):sqrt(x))
int main()
{
int x;
x=sq(-9);
printf("%d\n",x);
return 0;
}
,因爲你的#定義「SQ」檢查自己的負數,並把它變成正數計算平方根
它做的sqrt(-x),這是開方(前 - ( - 9))(取負負爲正)
所以它做的sqrt(9)
你有這樣的定義:
define sq(x) ((x<0)?sqrt(-x):sqrt(x))
既然你傳遞-9,x<0
是真實的,所以它做sqrt(9)
,這是3
然後打印3
的代碼做什麼它被告知,我想。
sq(x)
測試第一的x < 0
- 在你的情況,這是事實,所以sq(x)
電話sqrt(-(-9))
- 這是3
嘗試的解決方案是(x < 0) ? -sqrt(-x) : sqrt(x)
,這將返回負根爲負x
(我的最好詮釋你的意圖)。
如果你希望-3
,那麼你可能是指
#define sq(x) ((x<0)?-sqrt(-x):sqrt(x))
,但爲什麼你會想到負數的負平方根是超越我。
他可能會不想做'sqrt(-9)'......也許'-sqrt(-x)'? – 2012-01-27 18:39:00
@ReedCopsey,是的,編輯。但它仍然超出我:) – 2012-01-27 18:41:13
所以,基本上,由於期望的荒謬,它可能已經'#define sq(x)-3' :-) – 2012-01-27 18:42:48
等等,等等,等等。
難道我們想在這裏打破數學的基本規則?
-9的平方根是3 我。
這是因爲(-3)^ 2是9.負數有 '假想' 平方根。 sqrt(-1)是i。不是-1。 (-1)^ 2爲1.
爲什麼你期望輸出爲「-3」? – 2012-01-27 18:34:48
爲什麼你會期望任何平方根的結果是負數? – Mithrandir 2012-01-27 18:38:56
總是把宏參數放在他們自己的圓括號裏!如'#define sq(x)(((x)<0)?sqrt( - (x)):sqrt(x))'。想象一下,如果你在表達式中有'sq(a + b)'......' - (a + b)'與'-a + b'不一樣。 – pmg 2012-01-27 18:42:15