前面我們談到了,可用通過異或運算交換兩個數,而不需要任何的中間變數。 如下面:
void exchange(int &a, int &b)
然而,這裡面卻存在著乙個非常隱蔽的陷阱。
通常我們在對陣列進行操作的時候,會交換陣列中的兩個元素,如exchang(&a[i], &b[j]), 這兒如果i==j了(這種情況是很可能發生的),得到的結果就並非我們所期望的。
void main()
;exchange(a[0], a[1]); //交換a[0]和a[1]的值
printf("1---a[0]=%d a[1]=%d\n", a[0], a[1]);
exchange(a[0], a[0]); //將a[0]與自己進行交換
printf("2---a[0]=%d a[1]=%d\n", a[0], a[1]);
}上面那段測試**的輸出是:
1---a[0]=2 a[1]=1
2---a[0]=0 a[1]=1
很意外吧,第一次的交換正確的執行了,但是第二次呼叫exchange的時候卻將a[0]置為了0. 仔細分析,不難發現,這正是我們在exchange裡面用異或實現交換所造成的。如果輸入a和b是同乙個數,exchange裡面**相當於:
a ^= a;
a ^= a;
a ^= a;
成了a做了3次於自己的異或,其結果當然是0了。
既然這樣,我們就不能夠在任何使用交換的地方採用異或了,即使要用,也一定要在交換之前判斷兩個數是否已經相等了,如下:
void exchange(int &a, int &b)
不用中間變數實現倆個數交換
第一類方法也是常用的方法,通過多次的數值計算來完成交換,到現在知道的有下面三種 1 加減法。a a b b a b a a b 該方法可以交換整型和浮點型數值的變數,但在處理浮點型的時候有可能出現精度的損失,例如對資料 a 3.123456 b 1234567.000000 交換後各變數值變為 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 原...
關於 異或 及 無中間變數進行交換
如 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 原...