C基礎(chǔ)、經(jīng)典:交換a、b值較好的方法?
交換a、b的值在C語言的學(xué)習(xí)中是很常見的問題。最常用的方法就是引入一個(gè)中間變量當(dāng)做中間介質(zhì)來交換a、b的值。
代碼如下:
void?change_ab(int?*a,?int?*b)
{
????int?temp?=?0;
????temp?=?*a;
????*a?=?*b;
????*b?=?temp;
}
?。∽⒁獠荒軐憺椋?/p>
void?change_ab(int?a,?int?b)
{
????int?temp?=?0;
????temp?=?a;
????a?=?b;
????b?=?temp;
}
普通的變量傳遞,則不會改變內(nèi)存內(nèi)容,以為普通變量作為參數(shù)時(shí),其實(shí)是在內(nèi)存塊(??臻g)中新申請了一塊空閑塊,不是原來的內(nèi)存塊,而函數(shù)調(diào)用完畢之后,這塊新申請的內(nèi)存塊會由于變量的作用域失效而被系統(tǒng)回收。
如果把指針作為實(shí)參進(jìn)行傳遞,也就是把內(nèi)存地址傳了過去,那么操作這個(gè)指針?biāo)赶虻膬?nèi)存塊,必然會改變這個(gè)內(nèi)存的內(nèi)容了。
以上這種方法就是最常見的方法。那么,你知道如何將a、b的值進(jìn)行交換,并且不使用任何其他的中間變量?
方法一:采用算術(shù)的方法
void?change_ab(int?*a,?int?*b)
{
????*a?=?*a?+?*b;
????*b?=?*a?-?*b;
????*a?=?*a?-?*b;
}
方法二:采用異或的方法
void?change_ab(int?*a,?int?*b)
{
????*a?=?*a?^?*b;
????*b?=?*a?^?*b;
????*a?=?*a?^?*b;
}
方法一存在一個(gè)潛在的危險(xiǎn),當(dāng)形參的類型改為無符號16位時(shí),若a、b的值很大,那么a+b的值就有可能超出16位整數(shù)所能表示的范圍,從而造成程序運(yùn)行錯(cuò)誤。方法二則沒有這個(gè)問題,這是一種比較好的方法。
猜你喜歡
C語言、嵌入式重點(diǎn)知識:回調(diào)函數(shù)
C編程實(shí)踐:推箱子游戲
1024G 嵌入式資源大放送!包括但不限于C/C++、單片機(jī)、Linux等。在公眾號聊天界面回復(fù)1024,即可免費(fèi)獲?。?/span>
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!