2014-06-29 45 views
0

這預期表達是該程序:ÇPROG錯誤:前INT

#include <stdio.h> 
#define round(a) ((a-0.5)<int(a))?int(a):int(a+1) 
int main() { 
double a = 5.2; 
int m = round(a); 
printf("%d", m); } 

,它顯示了該錯誤:「INT」

+5

'(int)(a)',而不是'int(a)' – Tibor

+0

在末尾加上'return 0;'也很好。 –

+0

@TheDubleM:是的。更好的是'#include '並使用'return EXIT_SUCCESS;',它比''0'更清晰。 – unwind

回答

0

之前預期表達的錯誤是由於int(a)Syntactically這是錯誤的。它應該是(int)(a)

0

#define round(a) ((a-0.5)<int(a))?int(a):int(a+1) 

先後在wron地方括號

應該

#define round(a) (((int)((a)-0.5))<(a))?(int)(a):(int)(a+1) 
+1

你需要在比較中投出'(a)',否則它總會是真的。 – Barmar

+0

剛剛修復該問題 –

0

的問題是,int(a)無效C.

重新定義你的宏作爲如下:

#define round(a) (((a)-0.5)<(int)(a))?(int)(a):(int)(a+1) 

請注意,我也在a(a)-0.5附加了括號。

P.S.把它變成一個宏而不是一個功能的原因是什麼?

2

round是由標準C庫保留的名稱,所以它是未定義的行爲來調用您的宏的名稱(即使您不包括math.h)。

你的算法,可以更好地這樣表示:

#define my_round(a) ((int)((a) + 0.5)) 

其中也有隻有一次評估其論點的好處。

這將是最好使用內聯函數:

inline int my_round(double d) 
{ 
    return d + 0.5;  
} 

注意,這兩個選項將導致不確定的行爲,如果aINT_MININT_MAX大致範圍之外。如果它處於關鍵環境中,則應在進行int轉換之前讓內聯函數檢查d的範圍。

+1

問題中的原始宏​​對於2^52和2^53之間的偶數浮點數產生了錯誤的結果(對於名稱「round」中隱含的規範)。您的版本對於2^52和2^53之間的奇數浮點數字以及0.5的前導符號產生錯誤的結果。 –