这是该计划:
#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'之前的预期表达式
答案 0 :(得分:2)
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
的边界。
答案 1 :(得分:0)
错误是因为int(a)
。 Syntactically这是错误的。它应该是(int)(a)
。
答案 2 :(得分:0)
此
#define round(a) ((a-0.5)<int(a))?int(a):int(a+1)
括号是否位于错误位置应为
#define round(a) (((int)((a)-0.5))<(a))?(int)(a):(int)(a+1)
答案 3 :(得分:0)
问题是int(a)
无效C.
按如下方式重新定义宏:
#define round(a) (((a)-0.5)<(int)(a))?(int)(a):(int)(a+1)
请注意,我还在a
(a)-0.5
周围添加了括号。
P.S。是什么原因使它成为一个宏而不是一个函数?