Tauschen Sie zwei Variablen aus, ohne eine temporäre Variable zu verwenden

73

Ich möchte in der Lage sein, zwei Variablen ohne die Verwendung einer temporären Variablen in C # auszutauschen. Kann das gemacht werden?

decimal startAngle = Convert.ToDecimal(159.9);
decimal stopAngle = Convert.ToDecimal(355.87);

// Swap each:
//   startAngle becomes: 355.87
//   stopAngle becomes: 159.9
Sreedhar
quelle
30
Dieser Artikel bezieht sich auf: Regierung verbietet StackOverflow.com; Entwickler braucht 6 Stunden, um 2 Variablen
Basic
Verweisen Sie auf meine Antwort, indem Sie auf den folgenden Link klicken. Vertauschen von zwei Zahlen mit nur zwei Variablen .
Pankaj Lilan
1
decimal stopAngle = Convert.ToDecimal (159.9); dezimal startAngle = Convert.ToDecimal (355.87);
1
Ich schlage vor, die Antwort von @TimothyP zu C # 7-Tupeln als neu akzeptierte Antwort zu wählen. Dies ist jetzt der pragmatischste Weg, um Ihr Ziel zu erreichen.
Brandon Bonds
Konvertieren Sie niemals einen Gleitkomma in eine Dezimalzahl. Es sollte eine Zeichenfolge sein, kein Gleitkomma, z. B. Convert.ToDecimal ("159.9")
JoelFan

Antworten:

126

Zunächst einmal ist das Austauschen ohne temporäre Variable in einer Sprache als C # eine sehr schlechte Idee .

Zur Beantwortung können Sie diesen Code verwenden:

startAngle = startAngle + stopAngle;
stopAngle = startAngle - stopAngle;
startAngle = startAngle - stopAngle;

Probleme beim Abrunden können jedoch auftreten, wenn sich die beiden Zahlen stark unterscheiden. Dies liegt an der Natur von Gleitkommazahlen.

Wenn Sie die temporäre Variable ausblenden möchten, können Sie eine Dienstprogrammmethode verwenden:

public static class Foo {

    public static void Swap<T> (ref T lhs, ref T rhs) {
        T temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
}
Willem Van Onsem
quelle
35
Das ist gut für ganze Zahlen oder Festkommazahlen. Bei Gleitkommazahlen treten winzige Rundungsfehler auf. Sie können groß genug sein oder auch nicht, je nachdem, wie Sie die Zahlen verwenden.
Kennet Belenky
7
Solange Sie nicht auf Überlaufprobleme
stoßen
144
Die einzige gute Möglichkeit, dieses Problem zu lösen, ist die Verwendung einer temporären Variablen. "Cleverer" Code wie dieser (und mit "clever" meine ich "dumm") ist weit weniger lesbar und offensichtlich als die temporäre Variablenlösung. Wenn ich Code wie diesen von einem meiner Schergen sehen würde, würden sie sanktioniert und zurückgeschickt, um es richtig zu machen. Ich versuche es nicht speziell mit dir, @CommuSoft (seit du die Frage beantwortet hast), aber die Frage selbst war Müll.
Paxdiablo
4
@ Janusz Lenar: Nun, in Sprachen mit Zeigermanipulation könnten Sie den gleichen Trick verwenden, um die Zeiger zu tauschen. In C # können Sie dies in einer unsicheren Umgebung tun. : D Aber trotzdem gebe ich zu, Objekte ausgetauscht zu haben, ect. ohne eine dritte Variable ist eine schlechte Idee (als Reaktion darauf. __curious_geek). Aber die Frage lautete ausdrücklich, es ohne eine zusätzliche Variable zu tun.
Willem Van Onsem
14
Diese Technik ist rechenintensiver als die Verwendung einer temporären Variablen.
Mike
221

Der richtige Weg, um zwei Variablen auszutauschen, ist:

decimal tempDecimal = startAngle;
startAngle = stopAngle;
stopAngle = tempDecimal;

Verwenden Sie mit anderen Worten eine temporäre Variable.

Hier hast du es. Keine cleveren Tricks, keine Betreuer Ihres Codes, die Sie jahrzehntelang verfluchen, keine Einträge in The Daily WTF und kein zu viel Zeitaufwand, um herauszufinden, warum Sie ihn sowieso in einem Vorgang benötigen, da auf der untersten Ebene sogar der Das komplizierteste Sprachmerkmal ist eine Reihe einfacher Operationen.

Nur eine sehr einfache, lesbare, leicht verständliche t = a; a = b; b = t;Lösung.

Meiner Meinung nach versuchen Entwickler, die versuchen, Tricks zu verwenden, um beispielsweise "Variablen ohne Zeitarbeit zu tauschen" oder "Duffs Gerät", nur zu zeigen, wie klug sie sind (und kläglich scheitern).

Ich vergleiche sie mit denen, die hochkarätige Bücher nur lesen, um auf Partys interessanter zu wirken (im Gegensatz zur Erweiterung Ihres Horizonts).

Lösungen, bei denen Sie addieren und subtrahieren, oder XOR-basierte Lösungen sind weniger lesbar und höchstwahrscheinlich langsamer als eine einfache Lösung mit "temporären Variablen" (Arithmetik / Boolesche Operationen anstelle von einfachen Bewegungen auf Baugruppenebene).

Machen Sie sich und anderen einen Dienst, indem Sie lesbaren Code von guter Qualität schreiben.

Das ist mein Schimpfen. Danke fürs Zuhören :-)

Abgesehen davon bin ich mir ziemlich bewusst, dass dies Ihre spezifische Frage nicht beantwortet (und ich werde mich dafür entschuldigen), aber es gibt viele Präzedenzfälle in SO, in denen Leute gefragt haben, wie man etwas macht, und die richtige Antwort lautet "Nicht tun" Tu es".

paxdiablo
quelle
8
+1; und aus weiteren Gründen: Mit den Tricks +/- (etc) rechnen Sie unnötig. Bei ganzen Zahlen kann dies bei einem Push nahezu akzeptabel sein (Rundung / Überlauf sind keine Probleme, und die CPU-Kosten sind praktisch gleich Null), bei Dezimalstellen sind Addieren und Subtrahieren jedoch keine trivialen Operationen. Die FPU kann nicht einmal verwendet werden, da sie nicht float / double sind. Verwenden Sie also bereits eine temporäre Variable !!!
Marc Gravell
5
Natürlich ist dies der beste Weg, aber es wurde explizit ohne temporäre Variable gefragt
Willem Van Onsem
+1 Ich stimme dir zu. Wenn Sie anfangen, einfache Dinge zu komplizieren, werden Sie in den nächsten Jahren alle möglichen Probleme haben ...
Nelson Reis
2
Vielleicht gibt es einen echten Grund, die temporäre Variable nicht zu verwenden. Wenn die beiden Variablen extrem groß sind, möchten Sie keine neue erstellen, sodass 3 Variablen auch nicht für lange Zeit extrem groß sind.
Koumides
AFAIK, das Problem, das es löste, war das Abrollen einer Schleife in C, wobei ein nicht ganzzahliger Multiplikator im ersten oder letzten Zyklus berücksichtigt wurde. Sie können dies genauso einfach tun, ohne auf Duffs Gerät zurückzugreifen, und dies auf eine viel besser lesbare Weise. Wenn Sie der Meinung sind, dass es ein anderes Problem gelöst hat, das nicht "lesbarer" gelöst werden kann, bin ich offen für Überzeugungsarbeit. Selbst wenn es irgendwann in der Vergangenheit ein Problem gelöst hat, ist es heutzutage fast nie mehr notwendig, selbst auf allen außer den schwächsten eingebetteten Systemen.
Paxdiablo
137

In C # 7 wurden Tupel eingeführt, mit denen zwei Variablen ohne temporäre ausgetauscht werden können:

int a = 10;
int b = 2;
(a, b) = (b, a);

Dies weist bzu aund azu b.

TimothyP
quelle
8
Es ist nur eine Schande, dass diese Funktion vorher nicht existierte, wo er möglicherweise ein mächtiges neues Sprachkonstrukt gelernt hätte, das ihm mehr Werkzeuge in seiner Toolbox gegeben hätte, um Probleme zu lösen, anstatt all der nutzlosen Beschimpfungen oben.
Jeffrey Vest
Wie performant ist das aber? Ich fürchte immer eine "Tuple" -Instanz, die intern auf dem Heap erstellt wurde, und all diese ausgefallenen Dinge, die passieren.
Ray
-1, ich habe diesen Ansatz gerade auf IDEone getestet und er funktioniert nicht mit primitiven Typen. Es ist unwahrscheinlich, dass er auch mit Referenztypdaten funktioniert. ideone.com/03zt9U
TheBeardedQuack
@TheBeardedQuack Ihr Link zeigt korrekte Ergebnisse. Warum sagen Sie, dass es mit primitiven Typen nicht funktioniert?
AlexWei
74

Ja, verwenden Sie diesen Code:

stopAngle = Convert.ToDecimal(159.9);
startAngle = Convert.ToDecimal(355.87);

Bei beliebigen Werten ist das Problem schwieriger. :-)

Paul Sonier
quelle
43
int a = 4, b = 6;
a ^= b ^= a ^= b;

Funktioniert für alle Typen, einschließlich Strings und Floats.

Dies. __curious_geek
quelle
22
Ich hoffe, dass der XOR-Tausch eines Tages vergessen wird.
Hilfsmethode
9
Der XOR-Tausch steht kurz vor dem Höhepunkt der Nerdigkeit. Ich hatte ein paar Tage lang Nirvana, nachdem ich es in der Schule gelernt hatte.
Gabriel Magana
9
Dies scheint überhaupt nicht zu funktionieren stackoverflow.com/questions/5577140/…
Andrew Savinykh
3
Das ist C #. Der obige Code wird nicht ausgetauscht, wie @zespri sagt. Zu Ihrem letzten Satz: In C # können Sie den Operator nicht ^=mit stringoder verwenden float, sodass er nicht mit ihnen kompiliert wird.
Jeppe Stig Nielsen
5
Wenn ich jemals in einer US-Regierung fliege. Ich hoffe ernsthaft, dass ich nicht an einem Stapelüberlauf sterbe, der von einem Programmierer verursacht wurde, der "gehofft hat, dass der XOR-Tausch eines Tages vergessen wird"
Chris Beck,
22

BenAlabaster zeigte eine praktische Möglichkeit, einen Variablenwechsel durchzuführen, aber die try-catch-Klausel wird nicht benötigt. Dieser Code ist genug.

static void Swap<T>(ref T x, ref T y)
{
     T t = y;
     y = x;
     x = t;
}

Die Verwendung ist die gleiche wie er gezeigt hat:

float startAngle = 159.9F
float stopAngle = 355.87F
Swap(ref startAngle, ref stopAngle);

Sie können auch eine Erweiterungsmethode verwenden:

static class SwapExtension
{
    public static T Swap<T>(this T x, ref T y)
    {
        T t = y;
        y = x;
        return t;
    }
}

Verwenden Sie es so:

float startAngle = 159.9F;
float stopAngle = 355.87F;
startAngle = startAngle.Swap(ref stopAngle);

In beiden Fällen wird eine temporäre Variable in der Methode verwendet, Sie benötigen jedoch nicht die temporäre Variable, in der Sie den Austausch durchführen.

Marcus
quelle
2
Ja, aber nur in der Methode, nicht dort, wo Sie wechseln.
Marcus
3
Die Verwendung einer Abstraktion ist ein guter Weg, um das Problem zu lösen. Es bietet eine allgemeine Lösung für ein häufig auftretendes Problem und erleichtert das Lesen des aufrufenden Codes. Natürlich benötigt es ein paar zusätzliche Bytes Speicher und ein paar zusätzliche Prozessorzyklen, aber wenn Sie diesen Code nicht millionenfach aufrufen, werden Sie keinen Unterschied bemerken.
Olivier Jacot-Descombes
@ OlivierJacot-Descombes, ich hoffe, wenn Sie es millionenfach aufrufen, wird die JIT es optimieren.
Sebastian
2
Die Frage ist also, warum diese praktische Funktion nicht in der .NET-Bibliothek enthalten war. Dies ist das erste Beispiel in der Dokumentation zu generischen Methoden .
Mark Ransom
18

Ein binärer XOR-Swap mit einem detaillierten Beispiel:

XOR-Wahrheitstabelle :

a b a^b
0 0  0
0 1  1
1 0  1
1 1  0

Eingang:

a = 4;
b = 6;

Schritt 1 : a = a ^ b

a  : 0100
b  : 0110
a^b: 0010 = 2 = a

Schritt 2 : b = a ^ b

a  : 0010
b  : 0110
a^b: 0100 = 4 = b

Schritt 3 : a = a ^ b

a  : 0010
b  : 0100
a^b: 0110 = 6 = a

Ausgabe:

a = 6;
b = 4;
Steven Muhr
quelle
13

Nicht in C #. Im nativen Code können Sie möglicherweise den Triple-XOR-Swap-Trick verwenden, jedoch nicht in einer typsicheren Hochsprache. (Wie auch immer, ich habe gehört, dass der XOR-Trick tatsächlich langsamer ist als die Verwendung einer temporären Variablen in vielen gängigen CPU-Architekturen.)

Sie sollten nur eine temporäre Variable verwenden. Es gibt keinen Grund, warum Sie keinen verwenden können. Es ist nicht so, dass es nur ein begrenztes Angebot gibt.

Jens Alfke
quelle
Die meisten Typen, für die das XOR-Ding funktioniert, passen in ein Register, sodass der Compiler ihm sowieso keinen Stapelspeicher zuweisen sollte.
BCS
Stimmt, aber es ist komplexer als das. Sie müssen selten Werte auf Assembler-Ebene austauschen. Das Austauschen kann oft als Nebeneffekt anderer Arithmetik erfolgen. Meistens ist der Tausch nur erforderlich, um Dinge in einer Hochsprache auszudrücken. Nach dem Kompilieren ist der Tausch nicht mehr und kostet somit überhaupt keine Zeit :-)
Nils Pipenbrinck
Wenn der Speicher knapp ist, z. B. auf einem eingebetteten Gerät, sind die temporären Variablen manchmal knapp.
AsherMaximum
@AsherMaximum: aber es wäre besser, wenn C # eine Möglichkeit bieten würde, zwei Variablen auszutauschen. Dies kann dann mit oder ohne Temp-Variable implementiert werden. Wenn Sie dies explizit tun, wird der Code unlesbar und ist schwer zu pflegen.
Willem Van Onsem
13

Im Interesse zukünftiger Lernender und der Menschheit übergebe ich diese Korrektur der aktuell ausgewählten Antwort.

Wenn Sie die Verwendung von temporären Variablen vermeiden möchten, gibt es nur zwei sinnvolle Optionen , bei denen zuerst die Leistung und dann die Lesbarkeit berücksichtigt werden.

  • Verwenden Sie eine temporäre Variable in einer generischen SwapMethode. (Absolut beste Leistung neben der Inline-Temperaturvariablen)
  • Verwenden Sie Interlocked.Exchange. (5,9-mal langsamer auf meinem Computer, aber dies ist Ihre einzige Option, wenn mehrere Threads diese Variablen gleichzeitig austauschen.)

Dinge, die Sie niemals tun sollten:

  • Verwenden Sie niemals Gleitkomma-Arithmetik. (langsame, Rundungs- und Überlauffehler, schwer zu verstehen)
  • Verwenden Sie niemals nicht-primitive Arithmetik. (langsame Überlauffehler, schwer zu verstehen) Decimalist kein CPU-Grundelement und führt zu weitaus mehr Code als Sie denken.
  • Verwenden Sie niemals eine arithmetische Periode. Oder ein bisschen Hacks. (langsam, schwer zu verstehen) Das ist die Aufgabe des Compilers. Es kann für viele verschiedene Plattformen optimiert werden.

Da jeder harte Zahlen liebt, finden Sie hier ein Programm, das Ihre Optionen vergleicht. Führen Sie es im Release-Modus von außerhalb von Visual Studio aus, damit Swapes inline ist. Ergebnisse auf meinem Computer (Windows 7 64-Bit i5-3470):

Inline:      00:00:00.7351931
Call:        00:00:00.7483503
Interlocked: 00:00:04.4076651

Code:

class Program
{
    static void Swap<T>(ref T obj1, ref T obj2)
    {
        var temp = obj1;
        obj1 = obj2;
        obj2 = temp;
    }

    static void Main(string[] args)
    {
        var a = new object();
        var b = new object();

        var s = new Stopwatch();

        Swap(ref a, ref b); // JIT the swap method outside the stopwatch

        s.Restart();
        for (var i = 0; i < 500000000; i++)
        {
            var temp = a;
            a = b;
            b = temp;
        }
        s.Stop();
        Console.WriteLine("Inline temp: " + s.Elapsed);


        s.Restart();
        for (var i = 0; i < 500000000; i++)
        {
            Swap(ref a, ref b);
        }
        s.Stop();
        Console.WriteLine("Call:        " + s.Elapsed);

        s.Restart();
        for (var i = 0; i < 500000000; i++)
        {
            b = Interlocked.Exchange(ref a, b);
        }
        s.Stop();
        Console.WriteLine("Interlocked: " + s.Elapsed);

        Console.ReadKey();
    }
}
jnm2
quelle
1
Bit-Hacks sind eigentlich gar nicht langsam. Zum Beispiel 0wird ein Compiler zum Laden in ein Register die Variable mit sich selbst xorieren, weil der Befehl kürzer ist. In einigen seltenen Fällen wird durch die Verwendung weniger Variablen das Verschütten von Registern vermieden. Es ist die Aufgabe des Compilers, aber es ist bedauerlich, dass es keine Sprachunterstützung gibt, um dies effizient zu tun.
Willem Van Onsem
Du hast recht. In Fällen, in denen dies ein Hotspot ist und die Geschwindigkeit so wichtig ist, müssen Sie nicht verwaltet werden. Bit-Hacks schlagen in verwalteten Sprachen häufig fehl. Das liegt wirklich in der Verantwortung des Jitters.
jnm2
8

<veraltet>

Sie können es in 3 Zeilen mit einfacher Mathematik machen - in meinem Beispiel habe ich Multiplikation verwendet, aber eine einfache Addition würde auch funktionieren.

float startAngle = 159.9F;
float stopAngle = 355.87F;

startAngle = startAngle * stopAngle;
stopAngle = startAngle / stopAngle;
startAngle = startAngle / stopAngle;

Bearbeiten: Wie in den Kommentaren erwähnt, würde dies nicht funktionieren, wenn y = 0 wäre, da dies einen Fehler beim Teilen durch Null erzeugen würde, den ich nicht berücksichtigt hatte. Die alternativ vorgestellte +/- Lösung wäre also der beste Weg.

</ veraltet>


Um meinen Code sofort verständlich zu halten, würde ich eher so etwas tun. [Denken Sie immer an den armen Kerl, der Ihren Code pflegen muss]:

static bool Swap<T>(ref T x, ref T y)
{
    try
    {
        T t = y;
        y = x;
        x = t;
        return true;
    }
    catch
    {
        return false;
    }
}

Und dann können Sie es in einer Codezeile tun:

float startAngle = 159.9F
float stopAngle = 355.87F
Swap<float>(ref startAngle, ref stopAngle);

Oder...

MyObject obj1 = new MyObject("object1");
MyObject obj2 = new MyObject("object2");
Swap<MyObject>(ref obj1, ref obj2);

Fertig wie beim Abendessen ... Sie können jetzt jede Art von Objekt übergeben und umschalten ...

BenAlabaster
quelle
Ein bisschen gleich meiner Lösung, aber beachten Sie, dass Multiplikationen und Divisionsoperationen viel CPU-Zeit kosten. Und die oberen und unteren Grenzen eines Floats sind durch Multiplikation leichter zu erreichen.
Willem Van Onsem
Was meinst du mit "Dezimalstelle erlaubt keine Dezimalstellen"? Das klingt , als das Dezimalsystem Typen verwirrend ist repräsentieren reelle Zahlen mit hohen Genauigkeit (dezimal d = 9,1m; ist vollkommen gültig in C #).
Dirk Vollmar
1
@ CommuSoft: Punkt genommen, das hatte ich nicht berücksichtigt. In diesem Fall wäre das +/- sicherlich der bessere Weg.
BenAlabaster
2
Was ist los mit deiner Swap-Methode? Warum gibt es einen Bool zurück, warum ist dieser Bool immer wahr (falls vorhanden)? Warum verschluckt es alle Ausnahmen (was in diesem Fall meiner Meinung nach nur eine ThreadAbortException sein könnte, da es keinen Speicher zuweist oder den Aufrufstapel nicht vergrößert)?
Doug McClean
1
Einfache, stark typisierte Zuweisungen ohne Array-Varianz lösen niemals Ausnahmen aus. Typinkongruenzen werden beim Kompilieren abgefangen (darum geht es bei starker Typisierung).
Olivier Jacot-Descombes
8

In C # 7:

(startAngle, stopAngle) = (stopAngle, startAngle);
tomasz_kajetan_stanczak
quelle
7

Der Vollständigkeit halber hier der binäre XOR-Swap:

int x = 42;
int y = 51236;
x ^= y;
y ^= x;
x ^= y;

Dies funktioniert für alle atomaren Objekte / Referenzen, da es sich direkt um die Bytes handelt, erfordert jedoch möglicherweise einen unsicheren Kontext, um Dezimalstellen oder, wenn Sie sich wirklich verdreht fühlen, Zeiger zu bearbeiten. Unter bestimmten Umständen kann es auch langsamer als eine temporäre Variable sein.

thecoop
quelle
6

Wenn Sie von using decimalzu ändern können , können doubleSie die InterlockedKlasse verwenden. Vermutlich ist dies eine gute Möglichkeit, Variablen in Bezug auf die Leistung auszutauschen. Auch etwas besser lesbar als XOR.

var startAngle = 159.9d;
var stopAngle = 355.87d;
stopAngle = Interlocked.Exchange(ref startAngle, stopAngle);

Msdn: Interlocked.Exchange-Methode (Double, Double)

Robert Fricke
quelle
6

Mit C # 7 können Sie die Tupeldekonstruktion verwenden, um den gewünschten Austausch in einer Zeile zu erzielen, und es ist klar, was los ist.

decimal startAngle = Convert.ToDecimal(159.9);
decimal stopAngle = Convert.ToDecimal(355.87);

(startAngle, stopAngle) = (stopAngle, startAngle);
jdphenix
quelle
5

Passen Sie auf Ihre Umgebung auf!

Dies scheint beispielsweise in ECMAscript nicht zu funktionieren

y ^= x ^= y ^= x;

Aber das tut es

x ^= y ^= x; y ^= x;

Mein Rat? Nehmen Sie so wenig wie möglich an.

Codzart
quelle
Selbst auf c, wenn Zeiger beteiligt sind (z. B. in der Funktion) * a ^ = * b ^ = * a ^ = * b funktioniert nicht (lokale Variable funktioniert jedoch zB c ^ = d ^ = c ^ = d), aber * a ^ = * b ^ = * a; * b ^ = * a; funktioniert. Meine Wahl wäre also, * a ^ = * b zu verwenden; * b ^ = * a; * a ^ = * b; das funktioniert perfekt.
Pramod
1
Wie ist ECMAscript relevant? Die Frage ist mit C # gekennzeichnet.
Peter Mortensen
4

Der einfache Weg, 2 Zahlen in nur einer Zeile zu tauschen:

a=(a+b)-(b=a);

zB: a = 1, b = 2

Schritt 1: a = (1 + 2) - (b = 1)

Schritt 2: a = 3-1

=> a = 2 und b = 1


Effizienter Weg ist zu verwenden:

C Programmierung: (x ^= y), (y ^= x), (x ^= y);

Java: x = x ^ y ^ (y = x);

Python: x, y = y, x

Hinweis: Die häufigsten Fehler, die Menschen machen: // Tauschen Sie mit bitweisem XOR (Falsche Lösung in C / C ++)

x ^= y ^= x ^= y; 

Quelle: GeeksforGeek

Utsav Dusad
quelle
richtige c ++ : std::swap(x, y);.
Klarer
4
a = a + b
b = a - b
a = a - b

َ

Peter Mortensen
quelle
3

Für Binärtypen können Sie diesen funky Trick verwenden:

a %= b %= a %= b;

Solange a und b nicht genau dieselbe Variable sind (z. B. Aliase für denselben Speicher), funktioniert es.

BCS
quelle
3

Ich hoffe das könnte helfen ...

using System;

public class Program
{
    public static void Main()
    {
        int a = 1234;
        int b = 4321;

        Console.WriteLine("Before: a {0} and b {1}", a, b);

        b = b - a;
        a = a + b;
        b = a - b;

        Console.WriteLine("After: a {0} and b {1}", a, b);
    }
}
PalakM
quelle
3

Mit Tupeln

decimal startAngle = Convert.ToDecimal(159.9);
decimal stopAngle = Convert.ToDecimal(355.87);

(startAngle, stopAngle) = (stopAngle, startAngle);
Zu1779
quelle
2
startAngle = (startAngle + stopAngle) - (stopAngle = startAngle);
Ayub
quelle
2

Wir können das tun, indem wir einen einfachen Trick machen

a = 20;
b = 30;
a = a+b; // add both the number now a has value 50
b = a-b; // here we are extracting one number from the sum by sub
a = a-b; // the number so obtained in above help us to fetch the alternate number from sum
System.out.print("swapped numbers are a = "+ a+"b = "+ b);
cammando
quelle
1

Wenn Sie 2 Zeichenfolgenvariablen austauschen möchten:

a = (a+b).Substring((b=a).Length);

Eine Hilfsmethode entsprechend:

public static class Foo {
    public static void SwapString (ref string a, ref string b) {
       a = (a+b).Substring((b=a).Length);
    }
}

Verwendung wäre dann:

string a="Test 1";
string b="Test 2";
Foo.SwapString(a, b);
HGMamaci
quelle
0

Hier ein weiterer Ansatz in einer Zeile:

decimal a = 159.9m;
decimal b = 355.87m;

a = b + (b = a) - b;
Fubo
quelle
0

Hier ist ein anderer Prozess, um zwei Variablen auszutauschen

//process one
a=b+a;
b=a-b;
a=a-b;
printf("a= %d  b=  %d",a,b);

//process two
a=5;
b=10;
a=a+b-(b=a);
printf("\na= %d  b=  %d",a,b);

//process three
a=5;
b=10;
a=a^b;
b=a^b;
a=b^a;
printf("\na= %d  b=  %d",a,b);

//process four
a=5;
b=10;
a=b-~a-1;
b=a+~b+1;
a=a+~b+1;
printf("\na= %d  b=  %d",a,b);
AA Noman
quelle
-1
var a = 15;
var b = -214;
a = b | !(b = a);

Das funktioniert super.

Segavu
quelle
-4

Sehr einfacher Code zum Austauschen von zwei Variablen:

static void Main(string[] args)
{
    Console.WriteLine("Prof.Owais ahmed");
    Console.WriteLine("Swapping two variables");

    Console.WriteLine("Enter your first number ");
    int x = Convert.ToInt32(Console.ReadLine());

    Console.WriteLine("Enter your first number ");
    int y = Convert.ToInt32(Console.ReadLine());

    Console.WriteLine("your vlaue of x is="+x+"\nyour value of y is="+y);

    int z = x;
    x = y;
    y = z;

    Console.WriteLine("after Swapping value of x is="+x+"/nyour value of y is="+y);
    Console.ReadLine();
}
owais ahmed
quelle
8
Ziemlich sicher, dass dies hier zals temporäre Variable zählt.
Isochronous
1
@ Isochronous, wenn Sie es aus der Funktion verschieben und statisch machen Es wird nicht mehr
vorübergehend
-4

Sie können den folgenden Code ausprobieren. Es ist viel besser als der andere Code.

a = a + b;
b = a - b;
a = a - b;
as7
quelle
4
Dies ist genau das gleiche wie bei einigen anderen Antworten. Einige davon wurden bereits vor 7 Jahren hinzugefügt!
Bo Persson