Gibt es eine eingebaute Swap-Funktion in C?

Lesezeit: 5 Minuten

Gibt es in C eine eingebaute Swap-Funktion, die ohne Verwendung einer dritten Variablen funktioniert?

Benutzeravatar von Saiful
Saiful

Nein.
C++ eingebaute Swap-Funktion: swap(first,second);

Überprüfen Sie dies: http://www.cplusplus.com/reference/algorithm/swap/

Sie können dies verwenden, um zwei Variablenwerte auszutauschen, ohne die dritte Variable zu verwenden:

a=a^b;
b=a^b;
a=b^a;

Sie können dies auch überprüfen:

https://stackoverflow.com/questions/756750/swap-the-values-of-two-variables-without-using-third-variable

Wie kann man ohne dritte Variable tauschen?

  • die Lösung mit Summe und Differenz sollte vermieden werden. Bei Operanden von vorzeichenbehafteten Typen kann es zu einem Überlauf kommen und vorzeichenbehaftete Überläufe sind in C undefiniert.

    – au

    14. Januar 2012 um 12:32 Uhr

  • C++ Swap funktioniert nicht Arbeiten wie c=a; a=b; b=c;.

    – einpoklum

    8. Dezember 2020 um 8:58 Uhr

  • Verwenden Sie kein XOR und versuchen Sie nicht, eine dritte Variable zu vermeiden. Der Compiler weiß besser als Sie, wie er seine Arbeit zu erledigen hat.

    – einpoklum

    27. Januar um 15:33 Uhr

Warum willst du keine dritte Variable verwenden? Auf den meisten Architekturen ist dies der schnellste Weg.

Das XOR-Swap-Algorithmus funktioniert ohne dritte Variable, ist aber in zweierlei Hinsicht problematisch:

  1. Die Variablen müssen verschieden sein, dh swap(&a, &a) wird nicht funktionieren.
  2. Es ist allgemein langsamer.

Es kann manchmal vorzuziehen sein, den XOR-Swap zu verwenden, wenn die Verwendung einer dritten Variablen dazu führen würde, dass der Stack überläuft, aber im Allgemeinen sind Sie nicht in der Lage, diesen Aufruf zu tätigen.

Um Ihre Frage direkt zu beantworten, nein, es gibt keine Swap-Funktion in Standard-C, obwohl es trivial wäre, sie zu schreiben.

  • @delnan: Ich versuche nicht zu argumentieren, dass die Leistung wichtig ist. Ich sage nur, dass es keinen Grund (einschließlich Leistung) gibt, keine dritte Variable zu wollen.

    – Peter Alexander

    14. Januar 2012 um 12:27 Uhr

  • @delnan: int t = a; a = b; b = t; vs a ^= b; b ^= a; a ^= b;. Wo ist diese verschwendete Zeit? Und welches Universum schreibt einen Swap, der wesentlich zu der Zeit beiträgt, die Sie benötigen, um ein Problem zu lösen? Das muss das größte Nicht-Problem sein, das ich je gesehen habe.

    – Peter Alexander

    14. Januar 2012 um 12:30 Uhr

  • @delnan Wenn Sie sich meinen Beitrag ansehen, bin ich mir ziemlich sicher, dass meine Funktion als typunabhängig betrachtet wird, außer dass Sie die Größe der Werte, die als drittes Argument ausgetauscht werden, in Bytes angeben müssen, also denke ich, dass dies nicht der Fall ist technisch gelten als “keine dritte Variable verwenden”.

    – Patrick Roberts

    6. März 2015 um 21:45 Uhr


  • XOR Swap ist hauptsächlich ein Trick für C-Programmierer auf eingebetteten Systemen, wo Speicher kostbar ist

    – A.Gille

    8. Dezember 2020 um 10:33 Uhr

Benutzeravatar von Basile Starynkevitch
Basile Starynkevitch

Angenommen, Sie wollen a C solotion, nicht a C++ Erstens, Sie könnten es zu einem Makro machen, zumindest mit der GCC-Erweiterung, um es generisch genug zu haben, so etwas wie

 #define SWAP(x,y) do {   \ 
   typeof(x) _x = x;      \
   typeof(y) _y = y;      \
   x = _y;                \
   y = _x;                \
 } while(0)

Hüten Sie sich vor Tricks wie Anrufungen swap(t[i++],i); Um sie zu vermeiden, verwenden Sie den Adressoperator &. Und Sie verwenden besser ein temporäres (für Ganzzahlen gibt es einen berühmten und nutzlosen Trick mit exklusivem Oder).

PS: Ich verwende zwei lokale Variablen _x und _y (aber ich hätte nur eine lokale Variable verwenden können) für eine bessere Lesbarkeit und vielleicht auch, um mehr Optimierungen vom Compiler zu ermöglichen.

  • Was ist der Vorteil der Verwendung von zwei temporären Variablen anstelle von nur einer (z. B. typeof(x) _tmp = x; x = y; y = _tmp; ?

    – einpoklum

    28. Juli 2013 um 7:58 Uhr

  • Nur bessere Lesbarkeit und vielleicht einfachere Optimierung durch den Compiler.

    – Basile Starynkevitch

    28. Juli 2013 um 7:59 Uhr

Benutzeravatar von Igor
Igor

In Standard-C gibt es diese Funktion nicht.

(In C++ haben Sie std::swap().)


Vielleicht kann ein Makro aus dieser Frage für Sie nützlich sein.

Benutzeravatar von ouah
ouah

Es gibt keine Standardfunktion in C, um zwei Variablen auszutauschen.

Ein Makro kann folgendermaßen geschrieben werden:

#define SWAP(T, a, b) do { T tmp = a; a = b; b = tmp; } while (0)

und das Makro kann so aufgerufen werden:

int a = 42;
int b = 2718;

SWAP(int, a, b);

Einige Lösungen zum Schreiben eines SWAP-Makros sollten vermieden werden:

#define SWAP(a, b) do { a = b + a; b = a - b; a = a - b; } while (0)

Wenn Operanden vorzeichenbehaftete Typen sind, kann ein Überlauf auftreten, und ein vorzeichenbehafteter Überlauf ist ein undefiniertes Verhalten.

Auch eine Lösung, die versucht, die XOR-Lösung wie diese zu optimieren, sollte vermieden werden:

#define SWAP(a, b) (a ^= b ^= a ^=b)

a wird zwischen dem vorherigen und dem nächsten Sequenzpunkt zweimal geändert, verstößt also gegen die Regeln für Sequenzpunkte und ist ein undefiniertes Verhalten.

  • Ist die Version des SWAP-Makros von @BasileStarynkevitch nicht vorzuziehen?

    – einpoklum

    28. Juli 2013 um 8:01 Uhr

  • @einpoklum: Nein, da nicht jeder Compiler GCC ist, können Sie sich also nicht auf eine GCC-Erweiterung wie verlassen typeof(expr).

    Benutzer539810

    28. Juli 2013 um 8:40 Uhr

  • Ich liebe besonders die Verwendung von int als erste Argumente des Makros. Jetzt können wir behaupten, dass wir Vorlagen in unserer geliebten Sprache haben 🙂

    – paxdiablo

    4. Juli 2017 um 3:12 Uhr


  • Bitte erwägen Sie, den XOR-Swap-Vorschlag zu entfernen.

    – einpoklum

    27. Januar um 16:10 Uhr

Benutzeravatar von u0b34a0f6ae
u0b34a0f6ae

Da Sie in C jede Objektdarstellung in ein unsigned char Array kopieren können, erlaubt Ihnen das folgende Makro, zwei beliebige Objekte auszutauschen:

#define SWAP(X,Y) \
    do { \
        unsigned char _buf[sizeof(*(X))]; \
        memmove(_buf, (X), sizeof(_buf)); \
        memmove((X),  (Y), sizeof(_buf)); \
        memmove((Y), _buf, sizeof(_buf)); \
    } while (0)

GCC generiert hierfür in manchen Fällen sogar optimalen Code. Vielleicht behältst du deinen Job aber nicht…

  • Ist die Version des SWAP-Makros von @BasileStarynkevitch nicht vorzuziehen?

    – einpoklum

    28. Juli 2013 um 8:01 Uhr

  • @einpoklum: Nein, da nicht jeder Compiler GCC ist, können Sie sich also nicht auf eine GCC-Erweiterung wie verlassen typeof(expr).

    Benutzer539810

    28. Juli 2013 um 8:40 Uhr

  • Ich liebe besonders die Verwendung von int als erste Argumente des Makros. Jetzt können wir behaupten, dass wir Vorlagen in unserer geliebten Sprache haben 🙂

    – paxdiablo

    4. Juli 2017 um 3:12 Uhr


  • Bitte erwägen Sie, den XOR-Swap-Vorschlag zu entfernen.

    – einpoklum

    27. Januar um 16:10 Uhr

Benutzeravatar von Prinavin Govender
Prinavin Govender

Es gibt eine C++-Bibliotheksfunktion. Es vertauscht die Werte von zwei Integer-Variablen. Beispiel: swap(x, y); vertauscht die Werte der Variablen x und y. Ebenso ist swap(mat[i][j]Matte[j][i]); vertauscht zwei Werte in Matrix mat, nämlich den Wert in Zeile i Spalte j und den Wert in Zeile j Spalte i.

  • Eine C++-Bibliotheksfunktion ist weder eine C-Funktion, noch ist sie eingebaut.

    – Chris

    18. September 2014 um 18:55 Uhr

1395840cookie-checkGibt es eine eingebaute Swap-Funktion in C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy