前面我們談到了,可用通過異或運算交換兩個數,而不需要任何的中間變數。 如下面:
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)
異或交換兩個數
void swap int a,int b 一般我們可以用異或來進行交換兩個數,以前我也不知道會有這個問題,最近在準備考研寫排序的時候,發現自己寫的swap函式在選擇排序的時候會出現個別0。通過查閱大佬們的部落格,發現問題是由於swap在對同乙個物件進行異或的時候,因為同乙個物件的位址是相同的,所以...
按位異或交換兩個變數時的乙個陷阱
假設有兩個int型變數x和y,為了交換二者數值,我們可以借助臨時變數,如下所示 int tmp x x y y tmp 利用異或操作的特性,不使用臨時變數也可以到達交換的目的,如下所示 x x y y x y 即 y x y y x,y的值現在已經成x原來的值了 x x y x的值現在已經成y原來的...
關於通過異或交換兩個元素的值的乙個陷阱
include include using namespace std void swap int a,int b int main int argc,char argv int b swap a 0 a 1 將陣列b中的元素通過異或函式反轉 for int i 0,j 4 i j i j 輸出a,...