page contents

交换两个数的值 - 进阶版

五种方法交换两个数的值

在我们编写代码的过程中难免会遇到一个需求

那就是交换两个数的值

那这篇文章就是来讲述怎么交换两个数的值

交换两个数的值又有那些方法

首先,假设我们的程序中有了

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

这样做的话就不用担心数据溢出的风险了。

以上就是对交换两个数的值方法的总结。

  • 发表于 2021-05-19 17:18
  • 阅读 ( 685 )
  • 分类:C/C++开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
文双
文双

NB

71 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章