這預期表達是該程序:Ç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」
這預期表達是該程序:Ç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」
之前預期表達的錯誤是由於int(a)
。 Syntactically這是錯誤的。它應該是(int)(a)
。
這
#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)
你需要在比較中投出'(a)',否則它總會是真的。 – Barmar
剛剛修復該問題 –
的問題是,int(a)
無效C.
重新定義你的宏作爲如下:
#define round(a) (((a)-0.5)<(int)(a))?(int)(a):(int)(a+1)
請注意,我也在a
的(a)-0.5
附加了括號。
P.S.把它變成一個宏而不是一個功能的原因是什麼?
round
是由標準C庫保留的名稱,所以它是未定義的行爲來調用您的宏的名稱(即使您不包括math.h
)。
你的算法,可以更好地這樣表示:
#define my_round(a) ((int)((a) + 0.5))
其中也有隻有一次評估其論點的好處。
這將是最好使用內聯函數:
inline int my_round(double d)
{
return d + 0.5;
}
注意,這兩個選項將導致不確定的行爲,如果a
是INT_MIN
,INT_MAX
大致範圍之外。如果它處於關鍵環境中,則應在進行int轉換之前讓內聯函數檢查d
的範圍。
問題中的原始宏對於2^52和2^53之間的偶數浮點數產生了錯誤的結果(對於名稱「round」中隱含的規範)。您的版本對於2^52和2^53之間的奇數浮點數字以及0.5的前導符號產生錯誤的結果。 –
'(int)(a)',而不是'int(a)' – Tibor
在末尾加上'return 0;'也很好。 –
@TheDubleM:是的。更好的是'#include'並使用'return EXIT_SUCCESS;',它比''0'更清晰。 –
unwind