在c中使用#define表示方程式

时间:2013-12-10 20:56:18

标签: c

有人可以向我解释为什么这里y的值是13?

#include <stdio.h>
#define avg_sum(n) n * (n-1)/2
int main(){
    int y;
    int z = 9;
    y = avg_sum(z+1);
    printf("y=%i\n",y);
}

3 个答案:

答案 0 :(得分:8)

avg_sum(9+1) 9+1 * (9+1-1)/2 = 9 + 9/2 = 9+ 4 = 13

宏每次扩展所以9 + 1与10不同,使用如下保护括号可能会更好:

#define avg_sum(n) ((n) * ((n)-1)/2)

但是等效的功能会让你更好,更直观,只会评估一次参数

avg_sum(a++) ((a++) * ((a++)-1)/2) 并且会增加a两次,而函数将不会出现这些问题,因为在调用函数之前所有参数都被评估为< / p>

答案 1 :(得分:3)

回答这些问题的最佳方法是简单地扩展有问题的宏:

y = avg_sum(z+1);

y = z + 1 * (z + 1 - 1) / 2

y = 9 + 1 * (9 + 1 - 1) / 2

y == 13

这就是你在宏参数周​​围添加括号的原因。

#define avg_sum(n) ((n) * ((n)-1)/2)

答案 2 :(得分:2)

y = avg_sum(z+1);

扩展为z + 1 * (z+1-1)/2,但这是错误的。将您的宏更改为

#define avg_sum(n) ((n) * ((n)-1)/2)

并且总是将函数宏的参数括起来作为宏本身。这是一条重要的规则。