Voyons un exemple c simple pour échanger deux nombres sans utiliser la troisième variable.
programme 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();
}
Production:
Avant échange a = 10 b = 20 Après échange a = 20 b = 10
Programme 2: Utilisation de * et /
Voyons un autre exemple pour échanger deux nombres en utilisant * et /.
#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();
}
Production:
Avant échange a = 10 b = 20 Après échange a = 20 b = 10
Programme 3: Utilisation de l'opérateur XOR bit à bit:
L'opérateur XOR au niveau du bit peut être utilisé pour permuter deux variables. Le XOR de deux nombres x et y renvoie un nombre dont tous les bits valent 1 partout où les bits de x et y diffèrent. Par exemple, XOR de 10 (en binaire 1010) et 5 (en binaire 0101) est 1111 et XOR de 7 (0111) et 5 (0101) est (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;
Production:
Après échange: x = 5, y = 10
Programme 4:
Personne n'a encore suggéré d'utiliser std :: swap.
std::swap(a, b);
Je n'utilise aucune variable temporaire et en fonction du type de a et b, l'implémentation peut avoir une spécialisation qui ne l'est pas non plus. L'implémentation doit être écrite en sachant si une «astuce» est appropriée ou non.
Problèmes avec les méthodes ci-dessus:
1) L'approche basée sur la multiplication et la division ne fonctionne pas si l'un des nombres est 0 car le produit devient 0 quel que soit l'autre nombre.
2) Les deux solutions arithmétiques peuvent provoquer un débordement arithmétique. Si x et y sont trop grands, l'addition et la multiplication peuvent sortir de l'intervalle entier.
3) Lorsque nous utilisons des pointeurs vers une variable et faisons un échange de fonction, toutes les méthodes ci-dessus échouent lorsque les deux pointeurs pointent vers la même variable. Voyons ce qui se passera dans ce cas si les deux pointent vers la même variable.
// Méthode basée sur XOR au niveau du bit
x = x ^ x; // x becomes 0
x = x ^ x; // x remains 0
x = x ^ x; // x remains 0
// Méthode basée sur l'arithmétique
x = x + x; // x becomes 2x
x = x – x; // x becomes 0
x = x – x; // x remains 0
Voyons le programme suivant.
#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;
}
Sortie :
Après échange (& x, & x): x = 0
L'échange d'une variable avec elle-même peut être nécessaire dans de nombreux algorithmes standard. Par exemple, voyez cette implémentation de QuickSort où nous pouvons échanger une variable avec elle-même. Le problème ci-dessus peut être évité en mettant une condition avant l'échange.
#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;
}
Sortie :
Après échange (& x, & x): x = 10