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:
1 2 3 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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:
1 2 |
<barista@javaczyherbata.pl> java FirstVersion 8 2 x=2, y=8 |
Sposób z mnożeniem i dzieleniem
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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:
1 2 |
<barista@javaczyherbata.pl> java SecondVersion 8 2 x=2, y=8 |
Sposób z operatorem bitowym XOR
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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:
1 2 |
<barista@javaczyherbata.pl> 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”:)