0

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

4

2 回答 2

4

#define告诉预处理器在编译之前替换代码,所以你的行实际上是说:

int y = x / 6 * 32;

因为 * 和 / 运算符具有相同的优先级,并且从左到右计算,所以您得到 (x/6) * 32。编译器可能会为您执行此计算,因为 x 是已知的。

相反,在定义这样的宏时使用括号

于 2013-10-26T19:11:46.557 回答
2

在宏周围放置一个括号:

#define MULT (FOO * BAR)

现在,你会得到 147。

得到的原因150912是宏展开后表达式等价于:

y = 28296 / 6 * 32;

因此它被评估为28296/6然后乘以32.

正如@kevin 指出的那样,最好用括号括起来FOOBAR一般情况下也可以避免这样的意外。

于 2013-10-26T19:10:20.840 回答