#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 :(得分:2)
宏替换后,a + (MAX(b, abs(c)) * d)
变为:
a + (((b) > (abs(c))) ? (b) : (abs(c)) * d)
请注意,*
的优先级高于?:
,因此结果不符合您的预期。
正确的宏应该是:
#define MAX(a,b) (((a)>(b))?(a):(b))
// ^ ^
这是一个教训,您应该尽可能避免使用宏。因为很难编写正确的类函数宏。
答案 1 :(得分:1)
这是因为逻辑上错误的宏扩展:
(MAX(b, abs(c)) * d)
=&gt; (((b) > (abs(a))) ? (b) : (abs(a)) * d)
这里,(abs(a)) * d
优先于三元运算符。因此,336
(= b
,MAX
宏的输出)不会乘以-1
。
另外,正如我评论的那样,使用fabs()
表示浮点绝对值。 abs()
用于整数。
答案 2 :(得分: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
答案 3 :(得分:0)
a + (MAX(b, abs(c)) * d);
到
a + (MAX(b, abs(c)) )*d;
答案 4 :(得分: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已经成倍增加,所以它不会变为负数。