异或交换法仅适用于地址不同的整型变量,通过三次异或实现交换,但存在安全与可读性问题;推荐使用 std::swap,它经编译器优化、支持泛型和移动语义,更安全高效。

用异或运算直接交换两个整数
异或交换法适用于整型变量,且要求两个变量不能是同一内存地址(即不能是同一个变量)。原理是利用 a ^ a == 0 和 a ^ 0 == a 的性质,通过三次异或完成交换:a = a ^ b → b = a ^ b → a = a ^ b。
常见错误是直接对同一变量做操作,比如 swap(&x, &x),会导致结果为 0;或者在宏定义中未加括号引发优先级问题。
- 必须确保
a和b地址不同,否则交换后值变为 0 - 仅支持整数类型(
int、long等),浮点数、结构体不适用 - 现代编译器对
std::swap优化极好,异或写法未必更快,还可能降低可读性
int a = 5, b = 10; a ^= b; b ^= a; a ^= b; // 此时 a==10, b==5
用 std::swap 避免手写逻辑
标准库的 std::swap 是最安全、通用的选择。它对内置类型通常被编译器内联为最优指令(如 x86 的 xchg),对自定义类型自动调用移动语义(C++11 起),无需关心底层细节。
容易踩的坑是忘记包含头文件 <utility></utility>(C++11 及以后),或在老代码里误用过时的 std::swap 声明位置(如只包含 <iostream></iostream> 就调用)。
-
std::swap对 POD 类型零开销,对类类型自动适配拷贝/移动构造 - 不要在模板函数里裸写异或交换——泛型代码无法保证类型支持
^ - 若需交换数组元素或容器内容,
std::swap仍是最简方案
#include <utility> int x = 1, y = 2; std::swap(x, y); // 推荐做法</utility>
宏定义交换的风险与替代
有人用宏实现无临时变量交换,例如 #define SWAP(a,b) ((a)^=(b),(b)^=(a),(a)^=(b)),但这类宏极易出错:参数重复求值(如 SWAP(*p++, *q++))、类型不检查、无法用于 const 或引用。
真正需要宏的场景极少,多数情况是误以为“宏比函数快”——而 std::swap 已是内联函数,性能无差别。
- 宏不进行类型检查,
SWAP(3.14, 2.71)编译失败但报错晦涩 - 宏展开后可能改变表达式求值顺序,导致副作用不可控
- C++20 起可用
constexpr函数替代宏,更安全且支持编译期计算
为什么不要执着于“不用临时变量”
编译器看到 std::swap(a, b) 会直接生成最优机器码,根本不会分配“临时变量”——所谓“临时变量”只是源码层面的抽象。强行用异或或宏,反而阻碍优化、增加维护成本。
真正影响性能的是缓存局部性、内存对齐、是否触发拷贝构造等,而不是源码里有没有显式声明一个 tmp 变量。
如果变量是大型对象(如 std::vector<int></int>),移动语义让 std::swap 成为唯一合理选择;此时纠结“临时变量”毫无意义。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











