首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言變數交換三大法:XOR 交換、算術交換與臨時變數法深度對比

     編輯:關於C語言

三種交換實現

方法一:XOR 交換(推薦,無溢出風險)

a = a ^ b;
b = a ^ b; // b = (a^b)^b = a
a = a ^ b; // a = (a^b)^a = b

原理:異或運算滿足 x^x=0、x^0=x、交換律/結合律。
優點:無臨時變數、**絕不溢出**、位級操作極快。
缺點:a、b 為同一變數時會歸零(需檢查 &a != &b)。

方法二:算術交換(加減法,有溢出風險)

a = a + b;
b = a - b; // b = (a+b)-b = a
a = a - b; // a = (a+b)-a = b

缺點:a+b 可能溢出(有號整數溢出屬未定義行為),**生產代碼禁用**。

方法三:臨時變數法(標準、通用、最安全)

int tmp = a; a = b; b = tmp;

優點:語意清晰、適用所有類型(含浮點、結構體)、編譯器優化極好(寄存器分配、移除冗餘存取)。

效能與現代編譯器視角

  • 現代優化編譯器(-O2/-O3)會將三者**優化為相同機器碼**(通常是寄存器重命名或 XCHG 指令)。
  • 手寫 XOR/算術交換**反而可能阻礙優化**(別名分析困難),且降低可讀性。
  • 結論:永遠使用臨時變數法。理解 XOR 技巧僅為面試/閱讀舊代碼備用。

進階:泛型交換

// C++ 樣板
template<typename T> void swap(T& a, T& b) { T tmp = a; a = b; b = tmp; }

// C11 _Generic 或巨集模擬泛型
#define SWAP(a, b) do { typeof(a) tmp = (a); (a) = (b); (b) = tmp; } while(0)

總結

XOR 交換是位運算教科書級範例,展示了異或性質之美。**但工程實踐中:可讀性 > 微優化,臨時變數法才是正解。** 編譯器比程式設計師更擅長生成最優交換指令。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved