在c++开发过程中,交换两个变量的值是最基础的操作之一,不同的实现方式适用于不同的场景,下面汇总几种常用的交换方法。

方法一:使用临时变量交换
这是最直观也最不容易出错的交换方式,通过一个临时变量暂存其中一个值,再完成赋值操作。
#include <iostream>
using namespace std;
int main() {
int a = 10;
int b = 20;
// 定义临时变量暂存a的值
int temp = a;
a = b;
b = temp;
cout << "交换后 a = " << a << ", b = " << b << endl;
return 0;
}
这种方法的优点是逻辑清晰,适用于所有数据类型,包括自定义结构体,不会出现溢出问题,是日常开发中最推荐的方式。
方法二:不使用临时变量的算术运算交换
加减法交换
通过两个数的加减运算实现交换,不需要额外定义临时变量,但需要注意数值溢出的问题。
#include <iostream>
using namespace std;
int main() {
int a = 10;
int b = 20;
// 先让a变成两数之和
a = a + b;
// b等于原来的a值
b = a - b;
// a等于原来的b值
a = a - b;
cout << "交换后 a = " << a << ", b = " << b << endl;
return 0;
}
如果a和b的数值较大,相加后可能超过int类型的最大值,就会出现溢出错误,因此这种方式只适合数值较小的场景。
异或运算交换
利用异或运算的特性实现交换,同样不需要临时变量,也不会出现溢出问题,但逻辑相对难理解一些。
#include <iostream>
using namespace std;
int main() {
int a = 10;
int b = 20;
// 异或运算特性:x^x=0,x^0=x
a = a ^ b;
b = a ^ b; // 等价于 (a^b)^b = a
a = a ^ b; // 等价于 (a^b)^a = b
cout << "交换后 a = " << a << ", b = " << b << endl;
return 0;
}
这种方式只适用于整数类型,不能用于浮点数或者自定义类型,局限性比较大。
方法三:使用标准库函数swap
c++标准库提供了std::swap函数,可以直接完成两个变量的交换,内部实现通常是移动语义或者临时变量方式,效率很高。
#include <iostream>
#include <utility> // swap函数所在头文件
using namespace std;
int main() {
int a = 10;
int b = 20;
// 调用标准库swap函数
swap(a, b);
cout << "交换后 a = " << a << ", b = " << b << endl;
return 0;
}
这种方式代码最简洁,不需要自己实现交换逻辑,适合所有可交换的类型,是实际开发中最常用的方式。
方法四:自定义函数通过引用传递交换
如果需要在多个地方复用交换逻辑,可以自定义一个交换函数,通过引用传递参数来修改实参的值。
#include <iostream>
using namespace std;
// 自定义交换函数,参数使用引用传递
void mySwap(int &x, int &y) {
int temp = x;
x = y;
y = temp;
}
int main() {
int a = 10;
int b = 20;
// 调用自定义交换函数
mySwap(a, b);
cout << "交换后 a = " << a << ", b = " << b << endl;
return 0;
}
引用传递可以直接修改实参的值,不需要返回结果,函数调用起来和直接操作变量效果一致,适合封装通用逻辑。
不同方法对比
下面是几种交换方式的特性对比:
| 交换方法 | 是否需要临时变量 | 是否支持所有类型 | 是否有溢出风险 | 代码简洁度 |
|---|---|---|---|---|
| 临时变量交换 | 是 | 是 | 否 | 中等 |
| 加减法交换 | 否 | 仅整数 | 是 | 中等 |
| 异或运算交换 | 否 | 仅整数 | 否 | 较低 |
| 标准库swap | 内部实现决定 | 是 | 否 | 高 |
| 自定义引用函数 | 是 | 是 | 否 | 中等 |
日常开发中优先选择标准库的std::swap,如果需要自定义逻辑再考虑其他方式,不推荐使用加减法或者异或运算交换,容易引入不必要的风险。