#define swap(a,b) a = a ^ b; b = a ^ b; a = a ^ b;
int main()
{
swap(a,b)
}
给出正确答案。
#define swap(a,b) (a = a ^ b; b = a ^ b; a = a ^ b;)
int main()
{
swap(a,b)
}
给出编译错误:“;”之前的“ expected')' 令牌”
#define swap(a,b) ({a = a ^ b; b = a ^ b; a = a ^ b;})
int main()
{
swap(a,b); //note the semicolon at the end, without that the compiler gives an error
}
工作正常。
现在我的困惑是为什么第二个不起作用?我认为它应该工作完美。其次,为什么我需要在第三个宏调用的末尾添加分号?
如果将宏扩展出来,它们三个看起来像这样:
a = a ^ b; b = a ^ b; a = a ^ b;
(a = a ^ b; b = a ^ b; a = a ^ b;)
({a = a ^ b; b = a ^ b; a = a ^ b;});
第一个很好。第二个是语法错误:您不能用括号将多个语句括起来。没关系 第三种使用GCC扩展,称为语句表达式。您可以将一组语句括起来({ ... })
以将其视为表达式。
请注意,在宏中具有多个语句的标准惯用法是do { ... } while (0)
没有尾随分号的循环。
#define swap(a,b) do { a = a ^ b; b = a ^ b; a = a ^ b; } while (0)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句