在 C# 中不使用臨時變數交換變數值
因此,假設你現在正在編寫程式碼並想要交換變數值。你可能會做這樣的事情:
using System;
public class Program
{
public static void Main(string[] args)
{
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#
中使用的臨時變數
假設我們有兩個數字; 7
和 9
。第一個變數的值為 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
交換更高的程式碼級別。它不安全,應作為替代品儲存。
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