最常用的變數互換方法是採用中間變數:
void swap(int
*a,int
*b)
不用中間變數也可以實現變數互換
void swap(int
*a,int
*b)
這種用兩個變數加減的方法實現互換,仔細一想感覺會有問題,上面程式中,如果 *a + *b 超出int型資料的表示範圍會怎樣?
c語言中當兩個整數相加超出int型資料記憶體範圍時,高位直接捨棄.這樣即使相加超出範圍,互換的結果也是正確的,不信的可以自己動手試一試.
還有一種更巧妙的方法,用異或運算實現
void swap(int
*a,int
*b)
不管是異或的方法和加減的方法都存在乙個非常隱蔽的問題,當函式用於交換同乙個變數(即傳入引數a=b時),就會引發問題.這時候上面是表示式相當於:
*a ^= *a; //執行完後a=0
*a ^= *a; //a還是0
*a ^= *a; //a還是0
*a = *a + *a
//執行完後a為原來的兩倍
*a = *a - *a
//執行完後a=0
*a = *a - *a
//a還是0
這種情況在某些情況下是存在的,尤其是當交換陣列中的元素,如果邊界判斷沒有處理得很好的情況下, 在i=j時, 仍然交換a[i] 和a[j] 。一旦,遇到這種情…..
其實執行效率最高的還是用中間變臉法,特別是編譯器開優化後,中間變數直接被優化掉,直接在cpu的暫存器中完成互換.
流雲非晚
關於 異或 及 無中間變數進行交換
如 3 53的二進位制是11 5的二進位制是101 011101 110不一樣的位結果為1,否則為0.110轉換成十進位制是6 所以3 5 6 之前有見到通過 來進行兩值無中間數交換,現解釋如下 void swap int a,int b a b a 原a 原b b a b 原b a 原b 原a 原...
關於 異或 及 無中間變數進行交換
如 3 53的二進位制是11 5的二進位制是101 011101 110不一樣的位結果為1,否則為0.110轉換成十進位制是6 所以3 5 6 之前有見到通過 來進行兩值無中間數交換,現解釋如下 void swap int a,int b a b a 原a 原b b a b 原b a 原b 原a 原...
用異或實現交換,可不用中間變數
前面我們談到了,可用通過異或運算交換兩個數,而不需要任何的中間變數。如下面 void exchange int a,int b 然而,這裡面卻存在著乙個非常隱蔽的陷阱。通常我們在對陣列進行操作的時候,會交換陣列中的兩個元素,如exchang a i b j 這兒如果i j了 這種情況是很可能發生的 ...