宏的用法所以我定义..DEFINE()在expressinions
#define RADIAN(x) x*3.14159265f/180.0f
,然后用它是这样的:
RADIAN(theta-90)
我的程序不断地给了我不正确的结果,我花了几个小时意识到上述声明与下面的声明之间存在巨大差异。
RADIAN((theta-90))
现在我的程序运行得很好。为什么第一个陈述不正确?
宏的用法所以我定义..DEFINE()在expressinions
#define RADIAN(x) x*3.14159265f/180.0f
,然后用它是这样的:
RADIAN(theta-90)
我的程序不断地给了我不正确的结果,我花了几个小时意识到上述声明与下面的声明之间存在巨大差异。
RADIAN((theta-90))
现在我的程序运行得很好。为什么第一个陈述不正确?
#define
,使刚刚文本替换,所以RADIAN(theta-90)
真的是theta-90*3.14159265f/180.0f
,什么obvi不是你的意思。尝试
#define RADIAN(x) ((x)*3.14159265f/180.0f)
改为。
或更好的是,'内联浮动RADIAN(float x){return x * 3.14159265f/180.0f;}'以避免宏的所有缺陷。 – 2011-04-20 07:23:06
+1如果你真的想要使用宏,总是在参数周围添加括号,就像@ x13n所做的那样,并且要小心其他缺陷,包括因为它是* text *替换,表达式可能会被多次赋值:'#定义MAX(x,y)((x)<(y)?(y):(x))'将对'x'或'y'中的一个进行两次评估,所以MAX(sqrt(100),sqrt(4 ));''会调用'sqrt(100)'两次,'sqrt(4)'调用一次...使用内联函数的事情要简单得多:) – 2011-04-20 07:44:51
宏的largley做的基于文本的替代品,因此
RADIAN(theta-90)
扩展为:
theta - 90* 3.14159265f/180.0f
这是因为运算符优先级,计算结果为:
theta - (90* 3.14159265f/180.0f)
这是因为,在第一种情况下X将通过(θ-90)来代替让你的功能将评估为:上述
theta - 90* 3.14159265f/180.0f
的答案是正确的。然而,还有一点尚未...
这是C++,而不是C.停止使用预处理器宏。
在这种特殊情况下,我不认为C和C++中,应该用内联函数替换宏:'inline float radian(float x)',这与C和C++中的方式相同。 – 2011-04-20 07:46:12
操作顺序? – 2011-04-20 06:55:16