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("
", 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;就不做反編譯說明了,有興趣的可以自己看一下,理解一下。
補充:
JAVA不借助第三個變數實現兩個變數交換的思考
package mypackage public class demo 方法1 public void xchan01 int a,int b 方法2 public void xchan02 int a,int b 方法3 兩數交換不一定需要第三個元素 演算法問題 巧妙交換,提出的缺點會溢位經測驗是...
不借助第三個變數實現兩個變數交換的思考
網上存在三種方法 1 算術運算 簡單來說,就是通過 和 運算來實現。如下 int a,b a 10 b 12 a b a a 2 b 12b b a a 2 b 10a b a a 12 b 10 通過以上運算,a和b中的值就進行了交換。表面上看起來很簡單,但是不容易想到,尤其是在習慣標準演算法之後...
實現兩個值的交換(不借助第三個變數)
今天總結兩個不借助第三個變數實現兩個值的交換的方法 int main int main 今天主要聊聊第乙個方法,因為可讀性較強,並且聽一些老師說,這個方法也被很多網際網路公司作為面試題,但其實這個方法是有bug的,隱藏的很深,我們來分析分析。include void swap 1 int a,int...