天天看點

Swap in C C++ C# Java

寫一個函數交換兩個變量的值。

c:

錯誤的實作:

因為c語言的函數參數是以值來傳遞的(pass by value),參數傳遞時被copy了,是以函數中交換的是複制後的值。

正确的實作:

指針版:

函數使用時候傳遞的是變量的位址,如 swap(&a,&b),函數交換的是兩個指針指向的值,就是兩個變量的值,是以交換成功。

預處理版:

預處理的實質是文本替換(textual substitution)。

如下代碼:

Swap in C C++ C# Java
Swap in C C++ C# Java

預處理之後的代碼就是:

Swap in C C++ C# Java
Swap in C C++ C# Java

是以可以正确的交換兩個變量的值。

c++:

方式一:如同c語言使用指針。

方式二:使用“引用”(&)

c++的函數參數使用引用(&),值通過引用傳遞(pass by reference),函數中的參數不被 copy(如果傳的是類就不會調用拷貝構造函數),是以在函數中能正确交換兩個變量的值。

c#:

Swap in C C++ C# Java
Swap in C C++ C# Java

不要忘了ref關鍵字,如果沒有是不能正确交換的!

java:

使用集合中的static方法。

如果不使用數組集合,java中沒有一個簡單的函數來交換兩個變量的值。除非自己封裝一下:

Swap in C C++ C# Java
Swap in C C++ C# Java

c#這點和java是一樣的,c#版的交換如果不使用ref關鍵字,swap函數也沒法正确工作。

雖然c#、java通過函數參數可以修改參數的值,但是這點和c++的引用有很大的差別。

看看如下函數:

Swap in C C++ C# Java
Swap in C C++ C# Java

執行這個函數,将得到以下輸出:

———————————————————-

x: 0 y: 0

x: 100 y: 100

當java傳遞對象給函數之後,兩個引用指向了同一對象:

Swap in C C++ C# Java

當被傳遞給函數之後,一個對象至少存在兩個引用

java複制并傳遞了“引用”的值,而不是對象。是以,方法中對對象的計算是會起作用的,因為引用指向了原來的對象。但是因為方法中對象的引用是“副本”,是以對象交換就沒起作用。如下圖所示,交換動作隻對方法中的引用副本起作用了,不影響方法外的引用。是以不好意思,方法被調用後,改變不了方法外的對象的引用。如果要對方法外的對象引用做交換,我們應該交換原始的引用,而不是它的副本。

Swap in C C++ C# Java

隻有傳入函數的引用交換了,原始引用則沒有。

參考: 

http://www.cs.utsa.edu/~wagner/cs2213/swap/swap.html

http://stackoverflow.com/questions/1363186/is-it-possible-to-write-swap-method-in-java

http://www.importnew.com/3559.html

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

http://www.cnblogs.com/luxiaoxun/p/3999583.html