1 int a,b; 2 a=10;b=12; 3 a=b-a; //a=2;b=12 4 b=b-a; //a=2;b=10 5 a=a+b; //a=12;b=10
它的原理:把a,b看作數軸上的兩個點。spa
第一句「a=b-a」求出了ab兩點之間的距離,而且將其保存在a中;.net
第二句「b=b-a」求出了a到原點的距離(b到原點的距離減去ab兩點距離),而且將其保存在b中;指針
第三句「a=b+a」求出了b到原點的距離(a到原點的距離加上ab兩點距離),而且將其保存在a中。code
缺點:只能用於數字類型,字符串的交換就不行。blog
1 int a=10,b=12; 2 a=a^b; 3 b=a^b; 4 a=a^b;
它的原理:任意一個數與任意一個給定的數異或兩次,值不變。內存
1 int *a,*b; 2 a=new int(20); 3 b=new int(10); 4 if(a<b) 5 { 6 a=(int*)(b-a); 7 b=(int*)(b-(int(a)&0x0000ffff)); 8 a=(int*)(b+(int(a)&0x0000ffff)); 9 } 10 else 11 { 12 b=(int*)(a-b); 13 a=(int*)(a-(int(b)&0x0000ffff)); 14 b=(int*)(a+(int(b)&0x0000ffff)); 15 }
它的原理:它交換的是a和b的地址,而變量的值在內存中是沒有移動過的。字符串
其中,與運算「int(a)&0x0000ffff」,由於地址中高16位爲段地址,後16位爲位移地址,將它和0x0000ffff進行與運算後,段地址被屏蔽,只保留位移地址。例如:若&a=0x008f0200h,&b=0x008f1200h,在執行「a=(int*)(b-a);」時,a的值並非0x00000200h,而是要加上變量a所在內存區的基地址,即實際結果是0x008f0200h。其中,0x008f是基地址,0200是a在該內存區的位移。it
其次,地址運算不能出現負數,因此要先判斷a和b的大小。class
若有不對的地方,很是歡迎給予指導!變量
——【感謝】資料來源於http://blog.csdn.net/kangkermit/article/details/21371159