給定 a = 2, b = 5,不使用額外變數交換兩值,最終 a = 5, b = 2。
int temp = a;
a = b;
b = temp;
// 優點:可讀性最高、支援所有型別、JIT 優化極好
// 缺點:需額外 4/8 bytes 堆疊空間
a = a + b; // a = 7
b = a - b; // b = 2 (原 a)
a = a - b; // a = 5 (原 b)
// 風險:a + b 可能溢位 (int.MaxValue + 1 回繞)
// 修正:使用 checked 區塊或 long 中介
checked {
a = a + b;
b = a - b;
a = a - b;
}
a = a ^ b;
b = a ^ b; // b = a ^ b ^ b = a
a = a ^ b; // a = a ^ b ^ a = b
// 原理:XOR 可逆、交換律、結合律
// x ^ y ^ y = x
// 缺點:同一變數 (a == b) 時會歸零,需加保護
if (a != b) {
a ^= b; b ^= a; a ^= b;
}
(a, b) = (b, a);
// 編譯器生成臨時變數,語法最簡潔、型別安全、無溢位風險
// 適用於所有型別,包含參考型別、結構體、元組
| 方法 | 平均耗時 (ns) | 記憶體配置 | 備註 |
|---|---|---|---|
| 暫存變數 | 0.3 | 0 B | 基準 |
| Tuple 解構 | 0.3 | 0 B | 編譯器優化相同 |
| 算術運算 | 0.4 | 0 B | 多指令、溢位檢查 |
| XOR | 0.5 | 0 B | 現代 CPU 無優勢 |
(a, b) = (b, a):語意清晰、型別安全、效能最佳

