Jak zamienić wartości 2 zmiennych bez zmiennej tymczasowej?
Pamiętacie pewnie z Algorytmów czy Metod Programowania, jak trzeba było zamieniać wartości zmiennych miejscami, np. w algorytmach sortujących. Pisało się wtedy kod w stylu:
tmp = i i = j j = tmp
Poniżej prezentuje znalezione przeze mnie sposoby, jak zamienić wartości dwóch zmiennych bez użycia zmiennej pomocniczej.
Sposób z dodawaniem i odejmowaniem
public class FirstVersion {
public static void main(String[] args) {
int x = Integer.parseInt(args[0]);
int y = Integer.parseInt(args[1]);
x = x + y;
y = x - y;
x = x - y;
System.out.println("x=" + x + ", y=" + y);
}
}
Po uruchomieniu otrzymujemy:
java FirstVersion 8 2 x=2, y=8
Sposób z mnożeniem i dzieleniem
public class SecondVersion {
public static void main(String[] args) {
int x = Integer.parseInt(args[0]);
int y = Integer.parseInt(args[1]);
x = x * y;
y = x / y;
x = x / y;
System.out.println("x=" + x + ", y=" + y);
}
}
Po uruchomieniu otrzymujemy:
java SecondVersion 8 2 x=2, y=8
Sposób z operatorem bitowym XOR
public class ThirdVersion {
public static void main(String[] args) {
int x = Integer.parseInt(args[0]);
int y = Integer.parseInt(args[1]);
x = x ^ y;
y = x ^ y;
x = x ^ y;
System.out.println("x=" + x + ", y=" + y);
}
}
Po uruchomieniu otrzymujemy:
java ThirdVersion 8 2 x=2, y=8
Ostatni sposób jest najszybszy i najmniej newralgiczny. Mimo wszystko nie polecam używania powyższych konstrukcji w kodzie produkcyjnym, gdyż komplikują kod. Można je traktować jako ciekawostkę, chociaż słyszałem, że podobne pytania pojawiają się podczas rozmów rekrutacyjnych.
Można po prostu:
Ale takie rzeczy tylko w normalnych językach, a nie w Javie. 😉
W Perlu można np. tak:
a w PHP:
🙂
albo ASM:
int a = 20; int b = 10; __asm { mov EAX,b push EAX mov EAX,a mov b,EAX pop EAX mov a,EAX }🙂
Ale tutaj własnie użyłeś zmiennej tymczasowej! 😉
Taka „zmienna”, to jest „za darmo”:)