Comment permuter deux variables en C ou C++

Une troisième variable

La meilleure option pour permuter deux variables est d'utiliser une troisième variable temporaire :

int temp = a;
a = b;
b = temp;

Une fonction pour permuter

S'il est nécessaire d'écrire une fonction pour permuter une variable, le même mécanisme peut être utilisé dans la fonction avec les pointeurs :

// Permute a et b
void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

Autres (mauvaises) options

On trouve sur Internet d'autres solutions qui ne nécessitent pas l'utilisation d'une troisième variable. La suivante est l'une des plus fréquente :

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

Cette solution fonction avec des entiers, mais n'est pas une bonne idée. Premièrement, les additions et soustractions sont plus lentes que les affectations. Par conséquent, le code précédent est probablement plus lent que l'utilisation d'une troisième variable temporaire.

Le deuxième problème est que cette option ne fonctionne pas toujours avec des flottants. En additionnant un grand nombre réel avec un plus petit, le résultat peux être approché à cause de la façon dont les flottants sont codés en binaire. Le code suivant démontre le problème avec une permutation qui ne fonctionne pas correctement :

De la même façon, on trouve ce code pour permuter des pointeurs dans une fonction :

void swap(int* a, int* b)
{
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

Cette fonction ne fonctionne pas si a et b pointent vers la même adresse. Le premier XOR va effacer tous les bits de l'adresse et la fonction va retourner 0 comme adresse pour les deux pointeurs.

Conclusion

En conclusion, il n'y a qu'un bonne option, utiliser une variable temporaire :

int temp = a;
a = b;
b = temp;

ou, si vous écrivez une fonction :

void swap(int* a, int* b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

Voir aussi


Dernière mise à jour : 23/05/2022