![]() |
си и си++(как с ним бороться)
Недавно всплыла одна тема* Вопрос такой: как поменять местами две переменные без помощи третьей(temporary) ?
В си проблем нет . . . int a, b; a^=b^=a^=b; //в си все работает //но в плюсах ни хренашки,а должна, кто знает как правильно записать? //только не этот вариант, а именно первый... a=a+b; b=a-b; a=a-b; |
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?
|
a=a^b; b=a^b;a=a^b;
На самом деле есть еще несколько способов решить эту задачку, но этот по видимости самый эффективный. |
По поводу еффективности - готов поспорить :) Единственное его преимушество - не задействованость дополнительнои памяти дата сегмента. Можешь проверить сгенерированный асм код :)
Теперь о данной операции в принципе. Задача поставлена не корректно: переменные должны быть одного типа ! Иначе получаем то, что получаем :) Етот подвох, кстати, используйется часто при собеседованиях :) |
Зачем спорить, кидай другие методы и сравним :)
А про корректность, будет придираться, мы ведь не на собеседовании. ;) Тем более, что в примере они объявлены одинаково, да и вообще, если переменные разных типов, скажем int и float, то как ты их не меняй, хоть с помощью 3-ей переменной, хоть 4-ой, всё равно без приведения типов float в int не запихать, хоть ты убейся :) :row: |
FuzzyLogic
прав на все 100 :)) |
Izwraschenci ;-))) wremen programmirowaniya na C s kompjuterom Mikrosha (ili Vist) ;-))).
|
Goor
Может в C он не использует определённую временную переменную(3-ию) но точно пользуется дополнительной памятью или стёком для сохранения.Исключением может быть использование команды XCHG для каждого байта в структуре данных.Но это применимо для однотипных данных.Для чисел разных типов(я больше на паскале сидел) к примеру integer(в c++ int) и real(действительные числа) число типа integer можно вставить в переменную типа real но не наоборот.Так что для замены требуется что-бы данные были однотипными иначе нужно будет менять тип одной из переменных или создавать 3-ию временную переменную. |
Ne dumaju, chto-bi kompailer optimizirowal takoe wirajenie kak pod XCHG...
|
Люд-д-и-и-и-и!!!
Ну вот проспал самое интересное. Ладненько, все это конечно хорошо , но есть несколько "но" В самом начале я сказал, что в Си это действительно работает, по крайней мере этот вариант a^=b^=a^=b; а вот визуальный ли это обман или нет это второя сторона вопроса Что касается второго варианта, a=a+b; b=a-b; a=a-b; это чистая фикция потому что в этом примере он работает далеко не всегда, по одной простой причине , это то что у int есть предел и сумма "а" и "b" может выйти за эти пределы Но вопрос был другой как первый вариант осуществить в Си++ |
Nu znaesh-li, kto tebya prosit ispolzowat int??? Takie weschi nado delat s zapasom.
|
helldomain
no wed u "sapasa " tosge est predel.... ili? |
Тема для обсуждения, однако....
У любого вычисления есть предел и его закладывает программист, насколько я ето понимаю :) Если ето теоретический вопрос - то ответ уже был дан уважаемым FuzzyLogic. Если же нет, и ето вопрос "оптимизации", то ето просто изврашение :) IMHO... |
Nu tak naznachai takoi zapas, kotorogo hwatit...
|
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. |
Wpolne wozmojno, no tolko u menya pri maksimalnoi optimizacii C generilo kod s pamyatju. Bez XOR.
|
Wpolne wozmojno, no tolko u menya pri maksimalnoi optimizacii C generilo kod s pamyatju. Bez XOR.
|
Часовой пояс GMT +4, время: 13:57. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.