方法一:暫存變數 (標準、通用、最安全)
void swap(int *a, int *b) {
int t = *a; *a = *b; *b = t;
}
- 適用所有型別 (整數、浮點、結構體、指針)。
- 現代編譯器優化極好,無效能顧慮。
方法二:XOR 交換 (僅限整數、無暫存變數)
*a ^= *b; *b ^= *a; *a ^= *b;
// 或
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
- 原理:
x ^ x = 0, x ^ 0 = x, 結合律/交換律。
- 致命缺陷:若
a == b (同一記憶體),結果歸零!必須檢查指針相等。
- 浮點數不可用 (位元運算無意義)。
方法三:加減法 (整數/浮點通用、但有精度風險)
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
- 整數:若
*a + *b 溢位 → UB (有號) / 環繞 (無號),邏輯錯誤。
- 浮點:精度損失。大數吃小數 (如
1e9 + 1.0 == 1e9),交換後數值改變。
- 雙精度
double 緩解但未根治。
方法四:乘除法 (整數/浮點、更嚴重問題)
*a = *a * *b;
*b = *a / *b;
*a = *a / *b;
- 整數:溢位風險極大,且
*b == 0 除零崩潰。
- 浮點:精度損失同加減法,且除零風險。
總結建議表
| 方法 | 適用型別 | 風險 | 推薦度 |
| 暫存變數 | 所有 | 無 | ⭐⭐⭐⭐⭐ (首選) |
| XOR | 無號整數 | 同位址歸零 | ⭐ (教學/嵌入式極限優化) |
| 加減 | 整數/浮點 | 溢位/精度損失 | ⭐⭐ (理解原理即可) |
| 乘除 | 整數/浮點 | 溢位/除零/精度 | ⭐ (不推薦實戰) |
現代 C++ 最佳寫法
std::swap(a, b); // 模板、移動語意、ADL、無所有上述問題