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

2021-09-06 18:35:11 字數 1254 閱讀 3893

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...