在我们编写代码的过程中难免会遇到一个需求
那就是交换两个数的值
那这篇文章就是来讲述怎么交换两个数的值
交换两个数的值又有那些方法
首先,假设我们的程序中有了
int x = 10,y = 20;
我们要的结果是输出时
x = 20
y = 10
第一种方法:值传递法
int main()
{
int x = 10,y = 20;
printf("交换前:\nx:%d\ny:%d\n", x, y);
int t;
t = x;//存储x的值
x = y;//把y值赋给x,此时x的值被覆盖了
y = t;//在用存的x值赋给y,这样就实现了交换
printf("交换后:\nx:%d\ny:%d\n", x, y);
}
但是方法一存在问题:不能使用函数实现。
但是,我们有指针,指针是可以通过地址来改变函数外面实参的值。
第二种方法:址传递法
void swap1(int *x, int* y){
int t;
t = *x;//存储x的值
*x = *y;//把y值赋给x,此时x的值被覆盖了
*y = t;//在用存的x值赋给y,这样就实现了交换
}
int main()
{
int x = 10,y = 20;
printf("交换前:\nx:%d\ny:%d\n", x, y);
int *xx = &x;
int *yy = &y;
swap1(xx, yy);
printf("交换后:\nx:%d\ny:%d\n", x, y);
}
虽然,址传递确实能改变函数外面实参的值,但是多创建了两个指针。
如果每次都需要创建指针来交换未免也有点麻烦。
不过C++中有了引用的概念,可以使用引用来实现交换两个数的值。
方法三:引用传递法
void swap2(int &x,int &y){
int t;
t = x;//存储x的值
x = y;//把y值赋给x,此时x的值被覆盖了
y = t;//在用存的x值赋给y,这样就实现了交换
}
int main()
{
int x = 10,y = 20;
printf("交换前:\nx:%d\ny:%d\n", x, y);
swap2(x, y);
printf("交换后:\nx:%d\ny:%d\n", x, y);
}
虽然这样实现了两个数的交换,但是还是用到了t这个临时变量。
我们可以通过逻辑思维来省略临时变量t。
方法四:加减法
x = x + y;//保存x与y的和值
y = x - y;//从中取出x的值
x = x - y;//从中取出y的值
这种方法虽然没有使用临时变量t实现了交换
但是还有一个隐患,那就是在x+y的时候可能数据溢出
怎么解决呢?
这里就需要用到我们的异或运算符,什么是异或运算符呢?
异或运算符"∧"也称XOR运算符。
它的规则是:若参加运算的两个二进位同号则结果为0(假),异号则为1(真)。
即 0∧0=0,0∧1=1, 1^0=1,1∧1=0。
方法五:异或法
x = x^y;//取得xy二进制的共同点
y = x^y;//使用共同点得到x的值,给y
x = x^y;//使用共同点得到y的值,给x
这样做的话就不用担心数据溢出的风险了。
以上就是对交换两个数的值方法的总结。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!