Sehen wir uns ein einfaches c-Beispiel an, um zwei Zahlen ohne Verwendung der dritten Variablen auszutauschen.
Programm 1:
#include<stdio.h>
#include<conio.h>
main()
{
int a=10, b=20;
clrscr();
printf("Before swap a=%d b=%d",a,b);
a=a+b;//a=30 (10+20)
b=a-b;//b=10 (30-20)
a=a-b;//a=20 (30-10)
printf("\nAfter swap a=%d b=%d",a,b);
getch();
}
Ausgabe:
Vor dem Tausch a = 10 b = 20 Nach dem Tausch a = 20 b = 10
Programm 2: Verwenden von * und /
Sehen wir uns ein weiteres Beispiel an, um zwei Zahlen mit * und / auszutauschen.
#include<stdio.h>
#include<conio.h>
main()
{
int a=10, b=20;
clrscr();
printf("Before swap a=%d b=%d",a,b);
a=a*b;//a=200 (10*20)
b=a/b;//b=10 (200/20)
a=a/b;//a=20 (200/10)
printf("\nAfter swap a=%d b=%d",a,b);
getch();
}
Ausgabe:
Vor dem Tausch a = 10 b = 20 Nach dem Tausch a = 20 b = 10
Programm 3: Verwendung des bitweisen XOR-Operators:
Mit dem bitweisen XOR-Operator können zwei Variablen ausgetauscht werden. Das XOR aus zwei Zahlen x und y gibt eine Zahl zurück, die alle Bits als 1 hat, wo immer sich die Bits von x und y unterscheiden. Zum Beispiel ist XOR von 10 (In Binary 1010) und 5 (In Binary 0101) 1111 und XOR von 7 (0111) und 5 (0101) ist (0010).
#include <stdio.h>
int main()
{
int x = 10, y = 5;
// Code to swap 'x' (1010) and 'y' (0101)
x = x ^ y; // x now becomes 15 (1111)
y = x ^ y; // y becomes 10 (1010)
x = x ^ y; // x becomes 5 (0101)
printf("After Swapping: x = %d, y = %d", x, y);
return 0;
Ausgabe:
Nach dem Tauschen: x = 5, y = 10
Programm 4:
Bisher hat noch niemand vorgeschlagen, std :: swap zu verwenden.
std::swap(a, b);
Ich verwende keine temporären Variablen und je nach Typ von a und b hat die Implementierung möglicherweise eine Spezialisierung, die dies auch nicht tut. Die Implementierung sollte so geschrieben werden, dass bekannt ist, ob ein „Trick“ angemessen ist oder nicht.
Probleme mit den oben genannten Methoden:
1) Der auf Multiplikation und Division basierende Ansatz funktioniert nicht, wenn eine der Zahlen 0 ist, da das Produkt unabhängig von der anderen Zahl 0 wird.
2) Beide arithmetischen Lösungen können einen arithmetischen Überlauf verursachen. Wenn x und y zu groß sind, können Addition und Multiplikation außerhalb des ganzzahligen Bereichs liegen.
3) Wenn wir Zeiger auf eine Variable verwenden und einen Funktionsaustausch durchführen, schlagen alle oben genannten Methoden fehl, wenn beide Zeiger auf dieselbe Variable zeigen. Lassen Sie uns einen Blick darauf werfen, was in diesem Fall passieren wird, wenn beide auf dieselbe Variable zeigen.
// Bitweise XOR-basierte Methode
x = x ^ x; // x becomes 0
x = x ^ x; // x remains 0
x = x ^ x; // x remains 0
// Arithmetikbasierte Methode
x = x + x; // x becomes 2x
x = x – x; // x becomes 0
x = x – x; // x remains 0
Lassen Sie uns das folgende Programm sehen.
#include <stdio.h>
void swap(int *xp, int *yp)
{
*xp = *xp ^ *yp;
*yp = *xp ^ *yp;
*xp = *xp ^ *yp;
}
int main()
{
int x = 10;
swap(&x, &x);
printf("After swap(&x, &x): x = %d", x);
return 0;
}
Ausgabe :
Nach dem Tausch (& x, & x): x = 0
Das Austauschen einer Variablen mit sich selbst kann in vielen Standardalgorithmen erforderlich sein. Sehen Sie sich zum Beispiel diese Implementierung von QuickSort an, in der wir eine Variable mit sich selbst austauschen können. Das obige Problem kann vermieden werden, indem vor dem Austausch eine Bedingung gestellt wird.
#include <stdio.h>
void swap(int *xp, int *yp)
{
if (xp == yp) // Check if the two addresses are same
return;
*xp = *xp + *yp;
*yp = *xp - *yp;
*xp = *xp - *yp;
}
int main()
{
int x = 10;
swap(&x, &x);
printf("After swap(&x, &x): x = %d", x);
return 0;
}
Ausgabe :
Nach dem Tausch (& x, & x): x = 10