Уважаемый читатель, что бы ты сделал, желая обменять содержимое двух емкостей? Ну, для того, например, чтобы заменить водку в бутылке на минералку.
— Да чё тут думать?! Взял бы еще одну пустую посуду! — нашелся бы ты.
Молодец! Именно так и поступают программисты: для обмена значениями двух переменных создают еще одну, — временную — для «перелива». Сразу же после «подлога» ее можно удалить и высвободить сверхбыструю, регистровую память.
Вот как это делается в Си-шных языках:
int a=1; //первый стакан
int b=2; //второй стакан
int temp; //третий, пустой стакан
Вариант. 1:
temp =a; // отправляем содержимое первого стакана в третий
a=b; // отправляем содержимое второго стакана в первый
b= temp; // и наконец, содержимое третьего стакана попадает во второй
Или же вот так:
Вариант. 2:
a = a + b - (b = a); //Еще один вариант обмена, но уже без третьего стакана. Результат, правда, не так очевиден, да и все ли компиляторы дадут одинаковый результат?//
Итого — минимум три инструкции. Во втором случае, хотя и записано все в одну строку, операторы сложения, вычитания и присваивания будут выполняться последовательно слева-направо и по приоритетам.
А вот что умеет Assembler:
хchg ax, bx// обмен содержимого двух регистров, и всего за одну инструкцию!
Впечатляет? Но на самом деле, хотя в отладчике промежуточных инструкций и не видно, но они (микрокоманды) все же есть, и зашиты они в АЛУ центрального процессора. Вот такие дела — без третьего стакана никак не обойтись!