为什么这个数学不适用于宏?

时间:2013-10-26 19:07:46

标签: c c-preprocessor

为什么这个数学不适用于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),它将按预期工作。

2 个答案:

答案 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指出的那样,最好在FOOBAR周围添加括号,以避免出现这样的意外情况。