今天看到一位大神的博客,深受感觸。決定也發一篇博客,證明一下我還活着。
於是我翻看以前學習時做的一些筆記,整理了一下,得到了一個關於異或運算交換變量變量值的筆記。
首先來看下面三組表達式,看起來他們都能實現交換兩個變量的值。
a = a ^ b;
b = a ^ b;
a = a ^ b;
a = a ^ (b = b ^ (a = a ^ b));
a ^= b ^= a ^= b;
可實際的情況是,前面2組表達式,在C、C++、Java中都能順利完成變量值的交換。而第3組表達式,卻只在C、C++中通過了,而在Java中卻得到了意料之外的結果。請看下面的截圖
在C、C++中得到了想要的結果
// Java中x^= y^= x^= y的實際行爲
int tmp1 = x ; // x在表達式中第一次出現
int tmp2 = y ; // y的第一次出現
int tmp3 = x ^ y ; // 計算x ^ y
x = tmp3 ; // 最後一個賦值:存儲x ^ y 到 x
y = tmp2 ^ tmp3 ; // 第二個賦值:存儲最初的x值到y中
x = tmp1 ^ y ; // 第一個賦值:存儲0到x中
y = (x^= (y^= x))^ y ;
這句代碼就能夠做到寫這麼多,最後想說的就是在單個的表達式中不要對同一變量賦值兩次,賦值次數多了,就會引起混亂。