А действительно, почему?! Вопрос-то не праздный.
Фольклор, посвящённый перестановке значений двух переменных богат и многообразен. Одна из первых известных мне задач -- перестановка переменных в Алголе-60. (Знатоки истории программирования меня поймут, для остальных поясню: в Алголе-60 было два способа передачи параметров, по значению и по наименованию. По наименованию означала, что параметр как бы вписывается в место своего использования текстуально (при этом автоматически разрешается конфликт имен переменных). Например, если параметр -- a[j], и j поменялось, то поменялось и то, на какой элемент массива ссылается a[j].)
В те же благодатные времена люди экономили память. Её катастрофически не хватало -- адресное пространство БЭСМ-4 было 4096 слов. И всё.
Времена БЭСМ-4 прошли, а вместе с ними и эти моды. Попытаюсь ответить на вопрос: почему нет:
1) И
самое главное: эту программу читать (человеку) ничуть не проще, чем предыдущую.
2) Далеко не очевидно, какая из программ будет быстрее. Это зависит от языка. Это зависит от процессора. В ещё большей степени это зависит от оптимизации компилятора. Причины: нормальный компилятор вообще оставит промежуточную переменную на регистре, не отводя под неё память. таким образом прямая перестановка сведётся к двум чтениям и двум записям. В тоже время, во всех этих "оптимизациях" присутствует арифметика, и даже если предположить, что компилятор сумеет не записывать в память промежуточные результаты, регистров понадобится куда больше. По опыту, компилятор вряд ли сообразит. А доступ к памяти ой как дорог.
3) Съэкономите ли Вы память -- не очевидно. С хорошим компилятором -- скорее всего нет. Правда, для этого лучше писать
Код:
{ int temp = a[z]; a[z] = a[x]; a[x] = temp; }
, подчёркивая временную сущность temp.
4) Этот трюк очень зависит от типа. Для вещественных, например, он уже не подходит. А применять нестандартные решения лучше только тогда, когда есть острая необходимость.