Veamos un ejemplo simple de c para intercambiar dos números sin usar la tercera variable.
programa 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();
}
Salida:
Antes del intercambio a = 10 b = 20 Después del intercambio a = 20 b = 10
Programa 2: Uso de * y /
Veamos otro ejemplo para intercambiar dos números usando * y /.
#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();
}
Salida:
Antes del intercambio a = 10 b = 20 Después del intercambio a = 20 b = 10
Programa 3: haciendo uso del operador XOR bit a bit:
El operador XOR bit a bit se puede utilizar para intercambiar dos variables. El XOR de dos números xey devuelve un número que tiene todos los bits como 1 siempre que los bits de xey difieran. Por ejemplo, XOR de 10 (en binario 1010) y 5 (en binario 0101) es 1111 y XOR de 7 (0111) y 5 (0101) es (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;
Salida:
Después del intercambio: x = 5, y = 10
Programa 4:
Nadie ha sugerido usar std :: swap, todavía.
std::swap(a, b);
No utilizo ninguna variable temporal y, dependiendo del tipo de ayb, la implementación puede tener una especialización que tampoco. La implementación debe escribirse sabiendo si un 'truco' es apropiado o no.
Problemas con los métodos anteriores:
1) El método basado en la multiplicación y la división no funciona si uno de los números es 0, ya que el producto se convierte en 0 independientemente del otro número.
2) Ambas soluciones aritméticas pueden provocar un desbordamiento aritmético. Si xey son demasiado grandes, la suma y la multiplicación pueden salirse del rango de números enteros.
3) Cuando usamos punteros a una variable y hacemos un intercambio de función, todos los métodos anteriores fallan cuando ambos punteros apuntan a la misma variable. Echemos un vistazo a lo que sucederá en este caso si ambos apuntan a la misma variable.
// Método basado en XOR bit a bit
x = x ^ x; // x becomes 0
x = x ^ x; // x remains 0
x = x ^ x; // x remains 0
// Método basado en aritmética
x = x + x; // x becomes 2x
x = x – x; // x becomes 0
x = x – x; // x remains 0
Veamos el siguiente programa.
#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;
}
Salida :
Después del intercambio (& x, & x): x = 0
Es posible que sea necesario intercambiar una variable consigo misma en muchos algoritmos estándar. Por ejemplo, vea esta implementación de QuickSort donde podemos intercambiar una variable consigo misma. El problema anterior se puede evitar poniendo una condición antes del intercambio.
#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;
}
Salida :
Después del intercambio (& x, & x): x = 10