繁体   English   中英

C #define宏

[英]C #define macros

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

#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

三十

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM