如何不使用第三个变量完成a和b的交换
2014-06-21 11:52
531 查看
假设要交换a和b的值。
第一种方法:a=a+b;
b=a-b;
a=a-b;
相应代码如下:
这种方法有个弊端:容易越界,假设a和b都是32位数据,那么a=a+b就可能超过32位;
第二种方法:
a^a=0;
a^0=a;
a=a^b;
b=a^b(=a^b^b=a^0=a);
a=a^b(=a^b^a=a^a^b=0^b=b);
相应代码如下:
#include<stdio.h>
void swap(int *a,int*b){
if(*a==*b)return;
*a=*a^*b;
*b=*a^*b;
*a=*a^*b;
}
int main(){
int a,b;
int *p1,*p2;
scanf("%d %d",&a,&b);
p1=&a;
p2=&b;
swap(p1,p2);
printf("a=%d,b=%d\n",*p1,*p2);
return 0;
}这种方法对于a=b时,不适用
假设要交换a和b的值。
第一种方法:a=a+b;
b=a-b;
a=a-b;
相应代码如下:
#include<stdio.h> void swap(int *a,int*b){ *a=*a+*b; *b=*a-*b; *a=*a-*b; } int main(){ int a,b; int *p1,*p2; scanf("%d %d",&a,&b); p1=&a; p2=&b; swap(p1,p2); printf("a=%d,b=%d\n",*p1,*p2); return 0; }
这种方法有个弊端:容易越界,假设a和b都是32位数据,那么a=a+b就可能超过32位;
第二种方法:
a^a=0;
a^0=a;
a=a^b;
b=a^b(=a^b^b=a^0=a);
a=a^b(=a^b^a=a^a^b=0^b=b);
相应代码如下:
#include<stdio.h>
void swap(int *a,int*b){
if(*a==*b)return;
*a=*a^*b;
*b=*a^*b;
*a=*a^*b;
}
int main(){
int a,b;
int *p1,*p2;
scanf("%d %d",&a,&b);
p1=&a;
p2=&b;
swap(p1,p2);
printf("a=%d,b=%d\n",*p1,*p2);
return 0;
}这种方法对于a=b时,不适用
相关文章推荐
- [Java,JS] - 不使用第三个变量完成两个整数的交换
- 如何不使用第三个变量来交换两个数的值
- 如何不使用第三个变量进行数据交换?
- 不使用第三个变量完成两个整数的交换
- C语言(如何不使用第三个变量达到交换两个变量值的目的)
- 不使用第三个变量完成两个整数的交换
- 如何在不使用第三个变量的情况下交换两位数的值
- 如何不使用第三个变量来交换两个数的值
- 声明两个变量:int n1=10,n2=20;要求将两个变量交换,最后输出n1为20,n2为10。扩展(*):不使用第三个变量如何交换?
- 交换两个变量的值,不使用第三个变量
- 交换两个变量的值,不使用第三个变量
- 不使用第三个变量,实现两个变量值的交换
- 如何不使用额外变量来交换两变量
- 不使用第三个变量交换两个数字
- 不使用第三个变量交换a,b
- 不使用第三个变量的情况下交换两个变量中存储的值(Java)
- 如何不引进第三个变量,交换2个整形变量的值
- 交换两个变量的值,不使用第三个变量
- 不使用第三个变量,交换两个数
- 也论不使用第三个变量交换两个变量的值[C#]