2012-01-27 247 views
-3

爲什麼輸出是給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; 
} 
+5

爲什麼你期望輸出爲「-3」? – 2012-01-27 18:34:48

+0

爲什麼你會期望任何平方根的結果是負數? – Mithrandir 2012-01-27 18:38:56

+1

總是把宏參數放在他們自己的圓括號裏!如'#define sq(x)(((x)<0)?sqrt( - (x)):sqrt(x))'。想象一下,如果你在表達式中有'sq(a + b)'......' - (a + b)'與'-a + b'不一樣。 – pmg 2012-01-27 18:42:15

回答

4

,因爲你的#定義「SQ」檢查自己的負數,並把它變成正數計算平方根

它做的sqrt(-x),這是開方(前 - ( - 9))(取負負爲正)

所以它做的sqrt(9)

+0

如果我們直接寫sqrt( - 9)在c(--9)沒有任何意思...所以你怎麼能告訴這裏sqrt( - 9)(帶負的否定是積極的) – anil 2012-01-27 18:54:48

+0

@anil寫'sqrt( - ( - 9)) ''''我以爲你想用減量運算符。 – Dave 2012-01-27 19:00:51

+0

@anil:他沒有說' - 9',他說' - ( - 9)'。 – 2012-01-27 19:46:48

1

你有這樣的定義:

define sq(x) ((x<0)?sqrt(-x):sqrt(x)) 

既然你傳遞-9,x<0是真實的,所以它做sqrt(9),這是3

然後打印3

1

的代碼做什麼它被告知,我想。

sq(x)測試第一的x < 0 - 在你的情況,這是事實,所以sq(x)電話sqrt(-(-9)) - 這是3

嘗試的解決方案是(x < 0) ? -sqrt(-x) : sqrt(x),這將返回負根爲負x(我的最好詮釋你的意圖)。

+0

但實際上預處理器只是用傳遞的值替換x..so sq -9)應該看起來像這樣((-9 <0)?sqrt( - 9):sqrt(9))...它應該是一個錯誤...但你告訴它取代像這樣sqrt( - ( - 9))...怎麼可能 – anil 2012-01-27 19:00:07

+0

我相信'-1 * x'會起作用('--9'是'-1 * -9'被傳遞到'sqrt') – mzhang 2012-01-27 23:03:42

0

如果你希望-3,那麼你可能是指

#define sq(x) ((x<0)?-sqrt(-x):sqrt(x)) 

,但爲什麼你會想到負數的負平方根是超越我。

+0

他可能會不想做'sqrt(-9)'......也許'-sqrt(-x)'? – 2012-01-27 18:39:00

+0

@ReedCopsey,是的,編輯。但它仍然超出我:) – 2012-01-27 18:41:13

+0

所以,基本上,由於期望的荒謬,它可能已經'#define sq(x)-3' :-) – 2012-01-27 18:42:48

1

等等,等等,等等。

難道我們想在這裏打破數學的基本規則?

-9的平方根是3

這是因爲(-3)^ 2是9.負數有 '假想' 平方根。 sqrt(-1)是i。不是-1。 (-1)^ 2爲1.