3

这就是我所拥有的,我想知道它是如何工作的以及它实际上做了什么。

#define NUM 5
#define FTIMES(x)(x*5)

int main(void) {
    int j = 1;
    printf("%d %d\n", FTIMES(j+5), FTIMES((j+5)));
}

它产生两个整数:26 和 30。

它是如何做到的?

4

7 回答 7

17

发生这种情况的原因是因为您的宏将打印扩展到:

printf("%d %d\n", j+5*5, (j+5)*5);

意义:

1+5*5 and (1+5)*5
于 2009-01-26T19:05:09.933 回答
12

由于尚未提及,因此解决此问题的方法是执行以下操作:

#define FTIMES(x) ((x)*5)

宏展开中的括号x可防止运算符关联性问题。

于 2009-01-26T19:08:35.700 回答
3

定义只是一个字符串替换。

之后您的问题的答案是操作顺序:

FTIMES(j+5) = 1+5*5 = 26

FTIMES((j+5)) = (1+5)*5 = 30

于 2009-01-26T19:07:18.760 回答
2

编译器预处理只是简单地替换它看到的 FTIMES,然后编译代码。所以实际上,编译器看到的代码是这样的:

#define NUM 5
#define FTIMES(x)(x*5)

int main(void)
{

    int j = 1;

    printf("%d %d\n", j+5*5,(j+5)*5);
}

然后,考虑到运营商的偏好,您可以看到为什么会得到 26 和 30。

于 2009-01-26T19:06:51.600 回答
1

如果你想修复它:

#define FTIMES(x) ((x) * 5)
于 2009-01-26T19:09:42.810 回答
0

预处理器用 5 替换代码中的所有 NUM 次,用 x * 5 替换所有 FTIMES(x)。然后编译器编译代码。

它只是文本替换。

于 2009-01-26T19:06:25.207 回答
0

操作顺序。

FTIMES(j+5) 其中 j=1 计算结果为:

1+5*5

这是:

25+1

=26

通过制作 FTIMES((j+5)) 您已将其更改为:

(1+5)*5

6*5

30

于 2009-01-26T19:06:46.500 回答