交換a、b的值在C語言的學習中是很常見的問題。最常用的方法就是引入一個中間變量當做中間介質來交換a、b的值。
代碼如下:
void change_ab(int *a, int *b){ int temp = 0; temp = *a; *a = *b; *b = temp;}
!!注意不能寫為:
void change_ab(int a, int b){ int temp = 0; temp = a; a = b; b = temp;}
普通的變量傳遞,則不會改變內存內容,以為普通變量作為參數時,其實是在內存塊(棧空間)中新申請了一塊空閑塊,不是原來的內存塊,而函數調用完畢之后,這塊新申請的內存塊會由于變量的作用域失效而被系統回收。
如果把指針作為實參進行傳遞,也就是把內存地址傳了過去,那么操作這個指針所指向的內存塊,必然會改變這個內存的內容了。
以上這種方法就是最常見的方法。那么,你知道如何將a、b的值進行交換,并且不使用任何其他的中間變量?
方法一:采用算術的方法
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;}
方法一存在一個潛在的危險,當形參的類型改為無符號16位時,若a、b的值很大,那么a+b的值就有可能超出16位整數所能表示的范圍,從而造成程序運行錯誤。方法二則沒有這個問題,這是一種比較好的方法。
責任編輯:haq
-
C語言
+關注
關注
183文章
7644瀏覽量
145598 -
編程
+關注
關注
90文章
3716瀏覽量
97188
發布評論請先 登錄
PCA9545A/45B/45C:4通道I2C總線開關的深度解析
探索Microchip 93XX56A/B/C系列2Kbit串行EEPROM
PCA9543A/43B:2通道I2C總線開關的全面解析
深度解析SPL階段A/B分區啟動:spl_ab.c代碼全拆解
德州儀器LM5100A/B/C和LM5101A/B/C系列高壓柵極驅動器的深度解析
高壓柵極驅動器LM5100A/B/C和LM5101A/B/C:設計與應用詳解
深入剖析LM5100A/B/C與LM5101A/B/C高壓柵極驅動器
Texas Instruments LM5100A/B/C和LM5101A/B/C高壓柵極驅動器深度解析
深度剖析LM5100A/B/C與LM5101A/B/C高壓柵極驅動器
深入剖析LM5100A/B/C和LM5101A/B/C高壓柵極驅動器
Analog Devices / Maxim Integrated MAX98363 (A/B/C/D) 開發板數據手冊
C基礎:交換a、b值較好的方法?
評論