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

C語言交換兩數四大法:暫存變數、XOR、加減、乘除完整分析

     編輯:關於C

方法一:暫存變數 (標準、通用、最安全)

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、無所有上述問題
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved