宏中宏
Macro inside Macro
考虑以下代码:
#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
)。为什么不是这样?
您的操作没有优先级(这只是文本替换)因此,正如您所指出的,
#define P1(x) x+x
#define P2(x) 2*P1(x)
int a = P1(1) ? 1 : 0; // 1
并且由于 &
has lower precedence 比 +
等价于
int b = ((2 * a) + a) & a;
即b
.
上只设置了最右边的位
((2 * a) + a) 011 &
a 001 =
--------------------
b 001
这是因为 &
比加法 +
运算符的 precedence 低。操作数分组将发生
int b = ( (2*a + a) & a );
因此,(2*a + a) = 3
和 3 & 1 = 1
(011 & 001 = 001
)。
考虑以下代码:
#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
)。为什么不是这样?
您的操作没有优先级(这只是文本替换)因此,正如您所指出的,
#define P1(x) x+x
#define P2(x) 2*P1(x)
int a = P1(1) ? 1 : 0; // 1
并且由于 &
has lower precedence 比 +
等价于
int b = ((2 * a) + a) & a;
即b
.
((2 * a) + a) 011 &
a 001 =
--------------------
b 001
这是因为 &
比加法 +
运算符的 precedence 低。操作数分组将发生
int b = ( (2*a + a) & a );
因此,(2*a + a) = 3
和 3 & 1 = 1
(011 & 001 = 001
)。