imho.ws |
![]() |
![]() |
![]() |
# 1 |
Модератор
Регистрация: 08.07.2002
Адрес: Germany
Сообщения: 397
![]() ![]() ![]() |
си и си++(как с ним бороться)
Недавно всплыла одна тема* Вопрос такой: как поменять местами две переменные без помощи третьей(temporary) ?
В си проблем нет . . . int a, b; a^=b^=a^=b; //в си все работает //но в плюсах ни хренашки,а должна, кто знает как правильно записать? //только не этот вариант, а именно первый... a=a+b; b=a-b; a=a-b;
__________________
Системных администраторов нужно убивать еще в маленьком возрасте, когда они еще только "ламеры" (посвящено другу) В.И.Ленин(Письмо к Фейрбаху, Том12) |
![]() |
![]() |
# 2 |
Administrator
Регистрация: 13.05.2002
Сообщения: 11 227
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Znaesh dorogoi, w C++ eto rabotad tak prosto ne budet, chitai konvencii... I woobsche? S chego ti wzyal, chto zdes ti menyaesh bez tretjei peremennoi? Esli peremennaya yawlyaetsya stekom ili registrom processora ili daje prosto kuskom pamyati to ot etogo ona perestaet bit eju, tak uj po suti?
|
![]() |
![]() |
# 4 |
Guest
Сообщения: n/a
|
По поводу еффективности - готов поспорить
![]() ![]() Теперь о данной операции в принципе. Задача поставлена не корректно: переменные должны быть одного типа ! Иначе получаем то, что получаем ![]() ![]() |
![]() |
# 5 |
Guest
Сообщения: n/a
|
Зачем спорить, кидай другие методы и сравним
![]() А про корректность, будет придираться, мы ведь не на собеседовании. ![]() ![]() |
![]() |
# 8 |
Guest
Сообщения: n/a
|
Goor
Может в C он не использует определённую временную переменную(3-ию) но точно пользуется дополнительной памятью или стёком для сохранения.Исключением может быть использование команды XCHG для каждого байта в структуре данных.Но это применимо для однотипных данных.Для чисел разных типов(я больше на паскале сидел) к примеру integer(в c++ int) и real(действительные числа) число типа integer можно вставить в переменную типа real но не наоборот.Так что для замены требуется что-бы данные были однотипными иначе нужно будет менять тип одной из переменных или создавать 3-ию временную переменную. |
![]() |
# 10 |
Модератор
Регистрация: 08.07.2002
Адрес: Germany
Сообщения: 397
![]() ![]() ![]() |
Люд-д-и-и-и-и!!!
Ну вот проспал самое интересное. Ладненько, все это конечно хорошо , но есть несколько "но" В самом начале я сказал, что в Си это действительно работает, по крайней мере этот вариант a^=b^=a^=b; а вот визуальный ли это обман или нет это второя сторона вопроса Что касается второго варианта, a=a+b; b=a-b; a=a-b; это чистая фикция потому что в этом примере он работает далеко не всегда, по одной простой причине , это то что у int есть предел и сумма "а" и "b" может выйти за эти пределы Но вопрос был другой как первый вариант осуществить в Си++
__________________
Системных администраторов нужно убивать еще в маленьком возрасте, когда они еще только "ламеры" (посвящено другу) В.И.Ленин(Письмо к Фейрбаху, Том12) |
![]() |
![]() |
# 12 |
Модератор
Регистрация: 08.07.2002
Адрес: Germany
Сообщения: 397
![]() ![]() ![]() |
helldomain
no wed u "sapasa " tosge est predel.... ili?
__________________
Системных администраторов нужно убивать еще в маленьком возрасте, когда они еще только "ламеры" (посвящено другу) В.И.Ленин(Письмо к Фейрбаху, Том12) |
![]() |
![]() |
# 13 |
Guest
Сообщения: n/a
|
Тема для обсуждения, однако....
У любого вычисления есть предел и его закладывает программист, насколько я ето понимаю ![]() Если ето теоретический вопрос - то ответ уже был дан уважаемым FuzzyLogic. Если же нет, и ето вопрос "оптимизации", то ето просто изврашение ![]() |
![]() |
# 15 |
Newbie
Регистрация: 05.06.2002
Адрес: СПб
Сообщения: 6
![]() |
b]vityok[/b]
В варианте a^=b^=a^=b; для С нет необходимости задествовать дополнительную память или стек. Вот как это может выглядеть xor EAX,EBX xor EBX,EAX xor EAX,EBX Goor А почему ты решил, что вариант a=a+b; b=a-b; a=a-b; не будет работать при переполнении. По сути это та же арифметика, что и xor. Только xor это сложение по модулю 2, а этот вариант сложение по модулю 2^32. |
![]() |