變數互換方法,中間變數 加減 異或

2021-07-10 04:23:47 字數 874 閱讀 9966

最常用的變數互換方法是採用中間變數:

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了 這種情況是很可能發生的 ...