Pas de dépendances
#include <stdio.h> void swapint(int* a,int* b) { *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; } void swapint2(int* a,int* b) { *a ^= *b ^= *a ^= *b; } void swapint3(int* a,int* b) { (*a)+=(*b)-=(*a)=(*b)-(*a); } void swapint4(int* a,int* b) { (*a)/=(*b)=((*a)=(*a)*(*b))/(*b); } void swapint5(int* a,int* b) { (*a)=((*b)=((*a)=(*b)^(*a))^(*b))^(*a); } void swapint6(int* a,int* b) { (*b)=(*a)+(*b)-((*a)=(*b)); } int main() { int a,b; a = 135; b = 2834; swapint(&a,&b); printf("a = %d ; b = %d\n",a,b); return 0; }
Si vous lancez le programme, vous constatez qu'effectivement, la fonction swapint a inversé les valeurs des deux int le printf en témoigne. Pour l'instant, ne regardez pas swapint2,swapint3, etc.... La fonction swapint va réussir à échanger les variables sans en créer une troisième temporaire. Car en effet, habituelle, on ferait plutôt : int c = a; a = b; b = c; Cela crée une variable temporaire c. Ici, avec des ^ (xor) on échange les valeurs sans variable temporaire. J'avais fait une petite démonstration que j'avais écrit sur un forum : Voici la démonstration que j'ai : Je vire les * pour de la lisibilité : On a : a = a^b b = a^b a = a^b Pour de la démonstration, je vais faire intervenir des variables temporaires pour ne pas perdre les valeurs de base. On obtient : c = a^b d = c^b e = c^d Si je développe, on a : c = a^b d = (a^b)^b e = (a^b)^((a^b)^b) la parenthésage est inutile pour les Xor, tout est commutatif c = a^b d = a^b^b e = a^b^a^b^b Avec le Xor, x^x = 0 et x^0 = x c = a^b d = a e = b Or d = b, et e = a A la fin, on a donc a qui est devenu b et b qui est devenu a. Sur ce même topic : http://www.siteduzero.com/forum-83-673413-p1-inverser-deux-variables-sans-variable-temporaire.html magma propose une solution compacte encore plus bluffante : void swapint2(int *a, int *b) { *a ^= *b ^= *a ^= *b; } Zérotisme du même site me propose 4 nouvelles solutions intéressantes. Vous les trouverez dans les fonctions swapint3,swapint4,swapint5,swapint6