C #define宏

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

#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。

它是如何做到的?

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

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

含义:

 1+5*5 and (1+5)*5 

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

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

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

define只是一个字符串替换。

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

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

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

编译器预处理只是在它看到的地方替换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。

如果你想修复它:

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

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

它只是文字替换。

操作顺序。

其中j = 1的FTIMES(j + 5)评估为:

1 + 5 * 5

这是:

25 + 1

= 26

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

(1 + 5)* 5

6 * 5

三十