首页
学习
活动
专区
圈层
工具
发布

宏内宏
EN

Stack Overflow用户
提问于 2015-08-18 15:58:28
回答 2查看 48关注 0票数 2

考虑以下代码:

代码语言:javascript
复制
#define P1(x) x+x
#define P2(x) 2*P1(x)

int main()
{
    int a = P1(1) ? 1 : 0;
    int b = P2(a)&a;

    return 0;
}

现在,我认为编译器首先用它们的值来替换宏,所以是int b = 2*a+a&a; (从a=1b=3)。为什么不是呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-18 16:04:37

这是因为&优先比加法+运算符低。操作数的分组将作为

代码语言:javascript
复制
int b = ( (2*a + a) & a ); 

因此,(2*a + a) = 33 & 1 = 1 (011 & 001 = 001)。

票数 2
EN

Stack Overflow用户

发布于 2015-08-18 16:03:57

因此,正如您已经注意到的,在您的操作中没有优先级(它只是一个文本替代),

代码语言:javascript
复制
#define P1(x) x+x
#define P2(x) 2*P1(x)

int a = P1(1) ? 1 : 0; // 1

既然& 有较低优先权而不是+,它就相当于

代码语言:javascript
复制
int b = ((2 * a) + a) & a;

也就是说,在b上只设置了最右边的位。

代码语言:javascript
复制
((2 * a) + a)  011 &
      a        001 =
--------------------
      b        001
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32077208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档