交換a、b的值在C語(yǔ)言的學(xué)習(xí)中是很常見(jiàn)的問(wèn)題。最常用的方法就是引入一個(gè)中間變量當(dāng)做中間介質(zhì)來(lái)交換a、b的值。
代碼如下:
void change_ab(int *a, int *b){ int temp = 0; temp = *a; *a = *b; *b = temp;}
??!注意不能寫(xiě)為:
void change_ab(int a, int b){ int temp = 0; temp = a; a = b; b = temp;}
普通的變量傳遞,則不會(huì)改變內(nèi)存內(nèi)容,以為普通變量作為參數(shù)時(shí),其實(shí)是在內(nèi)存塊(??臻g)中新申請(qǐng)了一塊空閑塊,不是原來(lái)的內(nèi)存塊,而函數(shù)調(diào)用完畢之后,這塊新申請(qǐng)的內(nèi)存塊會(huì)由于變量的作用域失效而被系統(tǒng)回收。
如果把指針作為實(shí)參進(jìn)行傳遞,也就是把內(nèi)存地址傳了過(guò)去,那么操作這個(gè)指針?biāo)赶虻膬?nèi)存塊,必然會(huì)改變這個(gè)內(nèi)存的內(nèi)容了。
以上這種方法就是最常見(jiàn)的方法。那么,你知道如何將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)形參的類(lèi)型改為無(wú)符號(hào)16位時(shí),若a、b的值很大,那么a+b的值就有可能超出16位整數(shù)所能表示的范圍,從而造成程序運(yùn)行錯(cuò)誤。方法二則沒(méi)有這個(gè)問(wèn)題,這是一種比較好的方法。
責(zé)任編輯:haq
-
C語(yǔ)言
+關(guān)注
關(guān)注
183文章
7642瀏覽量
144530 -
編程
+關(guān)注
關(guān)注
90文章
3707瀏覽量
96715
發(fā)布評(píng)論請(qǐng)先 登錄
三星0603貼片104電容電壓值怎樣識(shí)別?
吉時(shí)利2602A KEITHLEY2602B 2611B 數(shù)字源表
MDMF304A1C9M-MINAS A6B 系列 (EtherCAT) 技術(shù)資料 -基本功能規(guī)格篇- 松下
MDMF304A1C9M-MINAS A6B 系列 (EtherCAT) 技術(shù)資料 -EtherCAT 通信規(guī)格篇- 松下
MDMF304A1C9M-MINAS A6B 系列 (EtherCAT) 標(biāo)準(zhǔn)規(guī)格書(shū) 松下
卡諾圖與布爾代數(shù)的聯(lián)系
MHMF092A1C4-MINAS A6B 系列 (EtherCAT) 技術(shù)資料 -基本功能規(guī)格篇- 松下
MHMF092A1C4-MINAS A6B 系列 (EtherCAT) 技術(shù)資料 -EtherCAT 通信規(guī)格篇- 松下
MHMF092A1C4-MINAS A6B 系列 (EtherCAT) 標(biāo)準(zhǔn)規(guī)格書(shū) 松下
MHMF092A1C2-MINAS A6B 系列 (EtherCAT) 技術(shù)資料 -基本功能規(guī)格篇- 松下
MHMF092A1C2-MINAS A6B 系列 (EtherCAT) 技術(shù)資料 -EtherCAT 通信規(guī)格篇- 松下
MHMF092A1C2-MINAS A6B 系列 (EtherCAT) 標(biāo)準(zhǔn)規(guī)格書(shū) 松下
三星貼片電容識(shí)別容值代碼方法
MHMF084A1C9M-MINAS A6B 系列 (EtherCAT) 技術(shù)資料 -EtherCAT 通信規(guī)格篇- 松下

C基礎(chǔ):交換a、b值較好的方法?
評(píng)論