为什么这个数学不适用于C中的宏?
#include <stdio.h>
#define FOO 6
#define BAR 32
#define MULT FOO * BAR
main() {
int x = 28296;
int y = x / MULT;
printf("%d / %d = %d\n", x, MULT, y);
return 0;
}
结果是:
28296 / 192 = 150912
为什么不是147?如果我将变量“int mult”设置为等于MULT,并使用表达式中的变量(int y = x / mult
),它将按预期工作。
答案 0 :(得分:4)
#define
告诉预处理器在编译之前替换代码,所以你的行实际上说:
int y = x / 6 * 32;
因为*和/运算符具有相同的优先级,并且从左到右进行求值,所以得到(x / 6)* 32.编译器可能会为你做这个计算,因为x是已知的。
相反,在定义像这样的宏
时使用括号答案 1 :(得分:2)
在宏周围放置一个括号:
#define MULT (FOO * BAR)
现在,你将获得147。
获得150912
的原因是在宏扩展之后表达式等同于:
y = 28296 / 6 * 32;
因此它被评估为28296/6
,然后乘以32
。
正如@kevin指出的那样,最好在FOO
和BAR
周围添加括号,以避免出现这样的意外情况。