#include<stdio.h>
int main()
{
// We use a trick involving exclusive-or to swap two variables
#define SWAP(a, b) a ^= b; b ^= a; a ^= b;
int x = 10;
int y = 5;
printf("%d%d\n",x,y );
if(x < 0)
SWAP(x, y);
printf("%d%d",x,y );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
105
515
Run Code Online (Sandbox Code Playgroud)
即使条件在if(10 <0为假)中评估为假,这个5 15即将到来?
您的SWAP宏调用将被预处理器替换.尽管它出现在一行中,但只有第一个语句是语句的一部分if.
if(x < 0)
SWAP(x, y);
Run Code Online (Sandbox Code Playgroud)
由预处理器转换为:
if(x < 0)
a ^= b; b ^= a; a ^= b; ;
Run Code Online (Sandbox Code Playgroud)
这实际上与:
if(x < 0)
a ^= b;
b ^= a;
a ^= b;
;
Run Code Online (Sandbox Code Playgroud)
您可以通过将宏定义中的所有语句放入块中来解决此问题,如下所示:
#define SWAP(a, b) do { a ^= b; b ^= a; a ^= b; } while( 0 )
Run Code Online (Sandbox Code Playgroud)
do/while技巧允许您使用分号跟随SWAP调用.