如何交換變量a和變量b的值?
方法一:引入第三個(gè)變量
這種方法比較常用,同時(shí)適用各種數(shù)據(jù)類(lèi)型。以C語(yǔ)言代碼為例,介紹如下:
int a=1, b=2;
int temp; //引入臨時(shí)變量
temp = a;
a = b;
b = temp;
方法二:不引入第三個(gè)變量
這種方法比較少見(jiàn),并且對(duì)于不同的數(shù)據(jù)類(lèi)型處理方式不一樣。筆者整理了三種處理方式,介紹如下:
1. 加減法:該方法可以交換整型和浮點(diǎn)型數(shù)值的變量,但在處理浮點(diǎn)型的時(shí)候有可能出現(xiàn)精度的損失。
a = a + b; //求和
b = a - b; //和-b得到a的值
a = a - b; //和-a得到b的值
當(dāng)a和b同號(hào)時(shí),求和得到的結(jié)果及有可能出現(xiàn)越界溢出的情況。
2. 異或法:在運(yùn)算過(guò)程中是將10進(jìn)制的數(shù)轉(zhuǎn)換成2進(jìn)制的數(shù)進(jìn)行異或運(yùn)算??梢酝瓿蓪?duì)整型變量的交換,對(duì)于浮點(diǎn)型變量它無(wú)法完成交換。由于是按位異或,所以不存在溢出的情況。
異或真值表如下:
| 輸入a | 運(yùn)算符 | 輸入b | 結(jié)果 |
|---|---|---|---|
| 1 | ^ | 0 | 1 |
| 1 | ^ | 1 | 0 |
| 0 | ^ | 0 | 0 |
| 0 | ^ | 1 | 1 |
異或運(yùn)算口訣:相同為0,相異為1.
利用異或法處理的C語(yǔ)言代碼如下:
#include <stdio.h>
int main(void)
{
int a=1, b=2;
a = a ^ b; // 01^10=11
b = a ^ b; // 11^10=01
a = a ^ b; // 11^01=10
}
3. 乘除法:可以處理整型和浮點(diǎn)型變量,但在處理浮點(diǎn)型變量時(shí)也存在精度損失的問(wèn)題。而且乘除法相比加減法要多一條約束:b不能為0.
a = a * b; //求積
b = a / b; //積/b=a
a = a / b; //積/a=b
綜上所述,還是引入第三個(gè)變量進(jìn)行數(shù)據(jù)的交換比較好,具有通用性,并且安全可靠,不存在后面幾種方法的缺陷(數(shù)據(jù)溢出,適用數(shù)據(jù)類(lèi)型有限制等狀況)
附
該文章于2017年6月13日于CSDN上首次發(fā)表,2017年12月22日搬家至此!