2014-09-03 81 views
0
#include<stdio.h> 
#define MAX(a,b) ((a)>(b))?(a):(b) 
int main() 
{ 
    double a = 100 , b, c, e; 
    int d = -1;  
    b = 336; 
    c = -33.600000000000001; 
    e = a + (MAX(b, abs(c)) * d); 
    printf("max is %f", e); 
    return 0; 
} 

該程序的輸出是436,而邏輯上它應該是-236。任何人都可以解釋爲什麼這個程序的輸出是變化的。輸出意外

+0

將'fabs'用於浮點絕對值。 – 2014-09-03 07:50:33

回答

0
a + (MAX(b, abs(c)) * d); 

a + (MAX(b, abs(c)))*d; 
+1

我想解釋一下這個不正確的行爲,我在這個程序中做錯了什麼。 – user1492793 2014-09-03 07:53:26

+0

@ user1492793不調試它。使用一些額外的臨時變量來簡化你的複合表達式,這樣你就可以看到printf或調試器出錯的地方(調試101)。 – 2014-09-03 07:55:15

1

這是因爲在邏輯上錯宏擴展的:

(MAX(b, abs(c)) * d) =>(((b) > (abs(a))) ? (b) : (abs(a)) * d)

這裏,(abs(a)) * d比三元算符優先更高。因此336= bMAX宏的輸出)不乘以-1

此外,正如我所評論的,使用fabs()作爲浮點絕對值。 abs()用於整數。

1
a + (MAX(b, abs(c)) * d); 
100 + (MAX(336, -33.6)*(-1)) 
100 + (((336)>abs(-33.6))?(336):abs(-33.6) * -1) /* Assuming fabs 33.6, may be 0 or other value otherwise */ 
100 + ((336>33.6)?336:-33.6) 
100 + 336 
436 
+0

abs(33.6)'= 33而不是33.6 – mch 2014-09-03 07:59:57

+0

@mch謝謝,更新 – 2014-09-03 08:00:47

2

宏替換後,a + (MAX(b, abs(c)) * d)變爲:

a + (((b) > (abs(c))) ? (b) : (abs(c)) * d) 

注意*?:一個優先級數字,所以結果不是你所期望的。

正確的宏觀應該是:

#define MAX(a,b) (((a)>(b))?(a):(b)) 
//    ^    ^

這是你應該避免可能的情況下使用宏的一個教訓。因爲編寫正確的函數式宏很困難。

0
d = -1; 
b = 336; 
c = -33.600000000000001; 
e = a + (MAX(b, abs(c)) * d); 

當宏被評估變得

e = a + (((b)>(abs(c))) ? (b):((abs(c)) * d) 

這裏(B)* d三元運算符之前被評估,因此三元運營商給出了答案336之後,d已被相乘,它不會改變爲負數。