[By JHF 學長]
這是某個風和日麗(?)的下午, 老闆跑進來說: 剛好, 每個人拿一張紙

寫下C, C++, Java的swap....結果自然慘不忍睹....


1.C 的版本 (Pass by Address)

void swap(int* a, int* b)
{
int c;
c = *a; // 這個時候 a是一個address, 但是*a則是一個int
*a = *b; // 所以把a, b的位址傳進來, 修改位址上的值,
*b = c; // 自然函式結束後, a b的值也交換了
}

int main(void)
{
int d = 3, e = 5;
printf("%d <-> %d", d, e);
swap(&d, &e); // 記得要傳入的是位址....
printf("%d <-> %d", d, e);
return 0;
}

Output:
3 <-> 5
5 <-> 3


2.C++ 的版本 (Pass by Reference)

void swap(int &a, int &b) // 老闆說: 這是C++ 不使用指標的產物
{ // 也就是'參考'
int c;
c = a; // 有沒有感覺很相似? 只是&a是位址 (on C的參考書)
a = b; // 或是參考 (on C++的參考書), 而a則是int
b = c;
}

int main(void)
{
int d = 3, e = 5;

cout << d << "<->" << e << endl;
swap(d, e); // 這就是傳參考的好處, 使用函式的人
// 不用考慮指標不指標的問題....
cout << d << "<->" << e << endl;
return 0;
}

Output:
3 <-> 5
5 <-> 3

這樣看起來感覺好用多了, 我們可以試著把cout改成printf,
然後用C 語言來編譯....你會得到parsing error的回應....

是的, 在C 語言中, 是不允許函式用void swap(int &a, int &b)
的方式宣告....所以雖然意義上是相似的....

反之, 如果拿C的版本去C++中編譯的結果呢? 放心, OK沒問題啦

--
以上的code都是經過實際測試的....保證正確
--
至於Java, 唔, 我本身對Java就不熟了, 這個部分就留個Java高手來解
文章標籤
全站熱搜
創作者介紹
創作者 iceis 的頭像
iceis

.: iceis' Blog :.

iceis 發表在 痞客邦 留言(2) 人氣(12,890)