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:
🙂
Ale tutaj własnie użyłeś zmiennej tymczasowej! 😉
Taka „zmienna”, to jest „za darmo”:)