有人可以向我解释为什么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);
}
Run Code Online (Sandbox Code Playgroud)
avg_sum(9+1) 9+1 * (9+1-1)/2 = 9 + 9/2 = 9+ 4 = 13
Run Code Online (Sandbox Code Playgroud)
宏每次扩展所以9 + 1与10不同,使用如下保护括号可能会更好:
#define avg_sum(n) ((n) * ((n)-1)/2)
Run Code Online (Sandbox Code Playgroud)
但是一个equivelant 函数会让你更好,更直观,只会评估一次参数
avg_sum(a++) 将会((a++) * ((a++)-1)/2)并且将增加a两次,而函数将不会出现这些问题,因为在调用函数之前所有参数都被评估
回答此类问题的最佳方法是简单地扩展相关宏:
y = avg_sum(z+1);
y = z + 1 * (z + 1 - 1) / 2
y = 9 + 1 * (9 + 1 - 1) / 2
y == 13
Run Code Online (Sandbox Code Playgroud)
这就是为什么在宏参数周围添加括号的原因。
#define avg_sum(n) ((n) * ((n)-1)/2)
Run Code Online (Sandbox Code Playgroud)