考虑以下代码:
#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=1
然后 b=3
)。为什么不是这样?
最佳答案
这是因为 &
的 precedence 较低。比加法 +
运算符更有效。操作数的分组将如下进行:
int b = ( (2*a + a) & a );
因此,(2*a + a) = 3
和 3 & 1 = 1
(011 & 001 = 001
)。
关于c - 宏内宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32077208/