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#連等算式都在做什么。