面试经典--不用中间变量交换两个整数的值

在网上搜了大概有四种办法:

 
用下面的程序验证一下:
void swap1(int &a,int &b)
{
    a=a+b;
    b=a-b;
    a=a-b;
    return;
}

void swap2(int &a,int &b)
{
    a=a-b;
    b=a+b;
    a=b-a;
}
/*swap3 很经典*/
void swap3(int &a,int &b)
{
   a^=b;
   b^=a;
   a^=b;
   /*等效的一句话操作是:
   	a^=b^=a^=b;
   */
}

/*swap4 ,最精炼*/
void swap4(int &a,int &b)
{
	b=a^b^(a=b);
}
int main(int argc, char const *argv[])
{
	int a=3;
	int b=4;

	printf("Before swap,a=%d ,b=%d\n",a,b );
	swap1(a,b);
	printf("After swap1,a=%d ,b=%d\n",a,b );

	swap2(a,b);
	printf("After swap2,a=%d ,b=%d\n",a,b );

	swap3(a,b);
	printf("After swap3,a=%d ,b=%d\n",a,b );

	swap4(a,b);
	printf("After swap4,a=%d ,b=%d\n",a,b );

	return 0;
}

 

输出结果证明解法有效:

image

但是需要注意的是,第一、二种方法有溢出威胁,第三、四种方法不适用与浮点数。

 

posted @ 2013-04-17 21:59  曾见绝美的阳光  阅读(254)  评论(0编辑  收藏  举报