日本亚洲欧美日韩中文字幕_精品欧美一区二区三区久久久_久久av高潮av无码av_成在人线av无码免费_亚洲中文字幕无码久久精品1

15757356768

全國統(tǒng)一學(xué)習(xí)專線 8:30-21:00

swap函數(shù)估計是一個各種各樣程序都會頻繁用到的子程序,可是你知道它究竟有多少種不同的寫法嗎?下面我就列舉我知道的幾種swap函數(shù)來跟大家分享一下。

(1)經(jīng)典型---嫁衣法

無論是寫程序還是干其他事情,一旦涉及到交換,就總是會遇到第三方。這個第三方可能是公正的監(jiān)督者,也可能是一個徒為他人做嫁衣的可憐蟲。在經(jīng)典法的交換程序中,我們就需要有一個可憐蟲來為我們提供暫時的服務(wù)。程序如下:
void swap(int *a,int *b)
{

int temp;
temp=*a;
*a=*b;
*b=temp;
}


我們看到,我必須用一個temp變量作為過渡,讓他先擁有然后又再賦值給其他人??梢娝膊皇峭阶黾抟?,而是先索取后奉獻(xiàn)的主人公精神。哈哈,扯遠(yuǎn)了。
(2)經(jīng)典型改進(jìn)版---范型法
上面的那個swap函數(shù)只能交換int類型變量,如果我想交換double類型,short類型,char類型......呢?上面的程序就必須重新寫,可是又不是完全推倒重來,只需要修改相應(yīng)的類型變量就可以了,如果是用C++來編程,我們還可以用到NB的模板,可是C語言就沒有這種特點了。唯一可以用的便是void*指針。void*指針可以視為一種通用指針,任何指針都可以轉(zhuǎn)換為void*指針而不會丟失值。同理,只要我們把原先的指針變量換成void*類型不就行了??墒?,你很快發(fā)現(xiàn),這樣不行。為什么呢?因為我們沒有通用的嫁衣。C語言中的變量不可以為void類型,也就是說沒有void temp; 這種古怪的東西。那怎么辦呢?我們可以從底層去想兩個數(shù)交換的本質(zhì)。不就是相應(yīng)的內(nèi)存值交換嘛。我們可以聯(lián)想到memcpy函數(shù),我們可以模仿著來,寫一個函數(shù),通過傳入void*指針和變量類型的字節(jié)大小,來將這兩個變量相應(yīng)的字節(jié)內(nèi)容發(fā)生對換。程序如下:

void swap(void *a,void *b,size_t size)

{

unsigned char *p1=(unsigned char *)a; //強制類型轉(zhuǎn)換

unsigned char *p2=(unsigned char *)b;
unsigned char temp; //字節(jié)型的嫁衣
while(size--)
{
temp=*p1;
*p1=*p2;
*p2=temp;
p1++;
p2++;
}
}

使用的時候可以這樣調(diào)用:swap( &a,&b,sizeof(int) );

這種字節(jié)的分別交換可以通用各種類型的交換,當(dāng)然,彼此之間應(yīng)該是同種類型,否則會因為類型大小,字節(jié)序等一些問題發(fā)生錯誤。

 


(3)取巧型---賦值法
這個方法其實一個很取巧的方法,大家先看一下程序,看能不能看出巧在哪里:
void swap(int *a,int *b)
{

*a=*a+*b;
*b=*a-*b;
*a=*a-*b;
}
這種方法有一個好處,那就是不用消耗額外的變量空間,只需要兩個變量做一些運算即可。讓我們慢慢看:

首先:

我用A代表a+b

A=a+b, 這時候A的值為兩者之和

接著,b=A-b, 也就是b=A-b=a+b-b=a,這時候b得到了a的值
最后,a=A-b, 因為經(jīng)過上面的運算,b=a,所以a=A-b=a+b-a=b,這時候a得到了b的值。
所以,交換成功了。

(4)詭異型---邏輯運算法
如果沒有仔細(xì)拿紙算一算的話,這段程序估計會暈倒很多人,讓我們來看一下吧:
void swap(int *a,int *b)
{

*a^=*b^=*a^=*b;
}
怎么樣,夠詭異的吧。如果我們把它拆開來看的話,其實也沒那么可怕:
首先我們必須明確運算順序,是從右至左:
*a=*a^*b;
*b=*b^*a;
*a=*a^*b;

在解釋這段代碼的時候,我們先普及一下邏輯運算的基礎(chǔ)知識,^ 符號是異或符號,也就是如果兩個邏輯變量各不相同,其表達(dá)式值為1,反之為0 。則有:

A^A=0

A^1=A
A^0=A

A^B^C=A^(B^C)=B^(A^C)

首先,A=a^b;

接著,b=b^A=b^a^b=a^0=a,這時候b獲得了a的值。

最后,a=A^b=a^b^a=b^0=b,這時候a獲得了b的值。

 


其實這個方法跟(3)的道理差不多,都是取巧,鉆了賦值的空子。如果你喜歡,你也可以把第三種寫成:*a-=*b-=*a+=*b; 這也可以算是一種詭異吧。

我就想到這么多swap函數(shù)了,你呢?

溫馨提示:為不影響您的學(xué)業(yè),來校區(qū)前請先電話咨詢,方便我校安排相關(guān)的專業(yè)老師為您解答
  • 熱門課程
  • 作者最新文章
  • 在線報名
申請試聽課程

只要一個電話
我們免費為您回電

姓名不能為空
手機號格式錯誤