在 C# 中不使用臨時變數交換變數值

Bilal Shahid 2023年1月30日 2022年7月18日
  1. C# 中使用元組賦值
  2. 使用 + 運算子繞過 C# 中使用的臨時變數
  3. C# 中使用函式交換值而不是顯式實現來隱藏臨時變數的使用
  4. 如何在 C# 中使用 XOR` 操作符來交換
在 C# 中不使用臨時變數交換變數值

因此,假設你現在正在編寫程式碼並想要交換變數值。你可能會做這樣的事情:

var val_one = 123;
var val_two = 234;

var val_swap = val_one;
val_one = val_two;
val_two = val_swap;

Console.WriteLine("The value after swapping is: " + val_one + " and -> " + val_two);

現在在這裡,你首先建立一個名為 val_swap 的臨時變數,然後將 val_one 值複製到其中,以便在修改 val_one 值後,你可以輕鬆地將原始 val_one 值複製回 val_two 通過將 val_swap 中的值分配給它。

今天,我們將著眼於消除這個臨時變數的使用,並在沒有任何其他分配的情況下執行這樣的交換。

C# 中使用元組賦值

你現在可以使用的一個非常簡單的方法是使用 TUPLE 賦值,如下所示。

(val_one, val_two) = (val_two, val_one);

Console.WriteLine("The value after swapping from the tuple method is: " + val_one + " and -> " + val_two);

輸出:

The value after swapping from the tuple method is: 234 and -> 123

這個方法在 Python 中也已經使用過;但是,不受元組的影響。

但是,有時你必須使用技巧來獲得想要的東西。讓我們看一個下面的例子。

使用 + 運算子繞過 C# 中使用的臨時變數

假設我們有兩個數字; 79。第一個變數的值為 7,第二個變數的值為 9

如果我們將 9 新增到 7,我們將得到 16。現在讓我們將 16 分配給第一個變數。

要將 9 作為第一個變數的值,你必須從第二個變數中減去 9 的值,即為 15-9 = 7;使用這個值並從第一個變數中的 15 中減去它,現在得到值 9

val_one += val_two;
val_two = val_one - val_two;
val_one = val_one - val_two;

Console.WriteLine("The value after swapping is: " + val_one + " and -> " + val_two);

輸出:

The value after swapping is: 234 and -> 123

你可以注意到它如何使用簡單的算術來在交換時停止使用臨時變數。另一方面,如果有非常大的準確值,這可能會變得無效,並且使用這種演算法可能會導致一些值的丟失。

如果你想隱藏實現而不只是刪除臨時變數的使用,你可以使用以下內容。

C# 中使用函式交換值而不是顯式實現來隱藏臨時變數的使用

你可以執行以下操作。

static void swap(ref int x, ref int y)
        {
            var temp = x;
            x = y;
            y = temp;
        }

然後在下面呼叫它:

swap(ref val_one, ref val_two);
Console.WriteLine("The value after swapping is: " + val_one + " and -> " + val_two);

輸出:

The value after swapping is: 234 and -> 123

如何在 C# 中使用 XOR` 操作符來交換

讓我們看看下面的程式碼。

val_one ^= val_two ^= val_one ^= val_two;

及其輸出:

The value after swapping is: 0 and -> 123

你會注意到第一個值是 0,即使第二個變數現在具有第一個變數的值並且可以正常工作。

那麼我們如何解決這個問題呢?我們先寫一段程式碼如下。

val_one ^= val_two;
val_two ^= val_one;
val_one ^= val_two;

現在輸出是:

The value after swapping is: 234 and -> 123

發生什麼了?我們先來了解第一個語句中給出的程式碼。

這可以擴充套件如下。

val_one = val_one ^ val_two;
val_two = val_two ^ val_one;
val_one = val_one ^ val_two;

現在你可以說第一個程式碼和後面介紹的程式碼差不多,那它怎麼不工作,但後者表現得很好呢?

改變這些算術運算的順序會產生不同的結果。在前面的程式碼中,val_one 與自身有一個 XOR,因此結果為 0。

但是,在後者中,順序已經定義,並且值已完美計算,因此存在差異。

但是,請記住不要使用 XOR 交換更高的程式碼級別。它不安全,應作為替代品儲存。

Author: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub