C# 不借助第三個變量實現兩整數交換


c#中實現兩個int變量的數值互換,在借助第三個變量做臨時載體的情況下,非常簡單。

int a = 10;
int b = 5;
int c ;
c = a;
a = b;
b = c;

如果不借助第三方變量,有幾種實現的方法:

1.異或算法(這種方法不借助第三個變量,也不會產生溢出,比較安全,但僅限整數類型)

int a = 10;
int b = 5;
a ^= b;
b ^= a;
a ^= b;
Console.WriteLine("{0}  {1}", a, b);

2.直接賦值(有溢出的風險???(這里用Int32.MaxValue做測試,沒有出現溢出,查看反編譯的代碼也不會出現溢出,不明白是不是不同的.net版本后台運算過程不一樣))

a = a + b - (b = a);

或者(絕對不會出現溢出)

b = a + (a = b) * 0;

直接賦值的方法理解了其中的原理,解決的方式可以有很多種,其中的+-*/可以做很多文章。

 

題外分析上面直接賦值的溢出風險:

貼上a=a+b-(b=a)的反編譯代碼,幫助理解:

IL_0006:  ldloc.0 //加載索引為0的變量值10到棧頂端
IL_0007:  ldloc.1 //加載5到棧頂端
IL_0008:  add     //提取10和5,執行add運算並將15推送到棧頂端
IL_0009:  ldloc.0 //加載10到棧頂端
IL_000a:  dup     //復制10到棧頂端
IL_000b:  stloc.1 //提取棧頂端值賦值給第1個變量
IL_000c:  sub     //提取當前棧頂端的10和15,做減法,講5推送至棧頂
IL_000d:  stloc.0 //提取棧頂端值賦值給第0個變量

這樣來看,唯一有溢出風險的a+b那里,並沒有將中間值賦給int類型的任何變量,這樣溢出風險也就應該不存在了。

b=a+(a=b)*0;就不做反編譯說明了,有興趣的可以自己看一下,理解一下。

 

補充:對於有的評論說還可以用“a ^= b ^= a ^= b;”,這里我補充說明這個算式是不能實現互換的,起碼.net 4.0的環境下是不行的。詳細的另有擴展話題C#連等算式都在做什么


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM