Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Бесконечный цикл, не повторяющийся ни разу. Внутри цикла объявляются a и b, им присваиваются значения и сразу же проверяется существование. зачем-то goto, которое ведет к следующей же строчке.
Ну можно ^= поменять на += и -= для числовых типов.
А для произвольного типа это же невозможно?
Или я туплю?
P.S. С += для чисел с плавающей точкой может возникнуть погрешность, а для целых, если язык проверяет, исключение по переполнению. Так что я совсем в сомнениях.
предлагаю тебе всего лишь взять что то типа ideone и написать уже аналог swap(int & a, int & b) в три классических ксора, чтобы было наглядно
ну и вызвать его с swap(a, a), вывести a
При вызове swap(a,a) он его обнулит первым xor'ом?
Ну собственно это не проблема ссылок, а проблема самого алгоритма с ксорами - он по определению не пашет на одной переменной.
А для устранения этого досадного случая можно добавить в начало функции if (&a != &b) return
Как раз Ада при вызове Swap не обнулит. Потому что в Аде передача целого по ссылке - это копирование значения в функцию, вызов функции, копирование изменённых значений обратно. И никаких тормозных указателей. Значения могут прийти в функцию (и выйти из неё) в регистрах, например. говНяшка с её указателями сосёт.
От реализации и от языка зависит, но обычно создаётся.
В случае value типов это может быть неприятно.
В том же C++ это тоже возможно, хоть и не так красиво:
Для того же std::vector это жуткий перерасход. Создастся по копии на каждый вектор, в то время, когда достаточно одной, а в случае stl даже 0. std::swap тем и хорош, что для stl контейнеров обмен происходит за О(1) и потребление памяти О(1).
Я однажды видел в С++ коде обмен через кортежи в те времена, когда ещё boost::tuple отсутствовал в стандарте С++ и выглядело это так:
tie(b, a)=tie(a, b);
Но, думаю, и так понятно, что Акеллагоре-оптимизатор промахнулся.
↓↓↓↓↓ ОН ПИДОР. ↓↓↓↓↓
А это что?
А для произвольного типа это же невозможно?
Или я туплю?
P.S. С += для чисел с плавающей точкой может возникнуть погрешность, а для целых, если язык проверяет, исключение по переполнению. Так что я совсем в сомнениях.
Или я совсем туплю?
а что если менять не значения, а ссылки?
Да вроде должно нормально поменять.
ну и вызвать его с swap(a, a), вывести a
Ну собственно это не проблема ссылок, а проблема самого алгоритма с ксорами - он по определению не пашет на одной переменной.
А для устранения этого досадного случая можно добавить в начало функции if (&a != &b) return
a,b=b,a
или
[a,b]=[b,a]
даж в пхп
list(a,b)=array(b,a)
я уж молчу про перл
http://ideone.com/Zq26N
а вообще, задача не такая частая, чтобы спецконструкцию городить, чреватую неоднозначностями
В таких случаях используют swap постоянно по коду.
(a, b) = (b, a)
Если именно оператор, то в Icon есть :=:
Костыли.
std::swap(a, b) и то лучше смотрится. Хоть дублирования переменных нет и меньше шансов на опечатку.
В случае value типов это может быть неприятно.
В том же C++ это тоже возможно, хоть и не так красиво:
Для того же std::vector это жуткий перерасход. Создастся по копии на каждый вектор, в то время, когда достаточно одной, а в случае stl даже 0. std::swap тем и хорош, что для stl контейнеров обмен происходит за О(1) и потребление памяти О(1).
Я однажды видел в С++ коде обмен через кортежи в те времена, когда ещё boost::tuple отсутствовал в стандарте С++ и выглядело это так:
Но, думаю, и так понятно, что Акеллагоре-оптимизатор промахнулся.
А сами ссылки они же иммутабельны, как их поменять...
Опять я про кулхацкерские байтоёбские штучки...
И да, с неподами может случиться хуйня.
не-POD