输出意外

时间:2014-09-03 07:48:42

标签: c macros

#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。谁能解释一下为什么这个程序的输出会有所不同。

5 个答案:

答案 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= bMAX宏的输出)不会乘以-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已经成倍增加,所以它不会变为负数。