imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 30.08.2002, 06:29     # 1
Goor
Модератор
 
Регистрация: 08.07.2002
Адрес: Germany
Сообщения: 397

Goor МолодецGoor МолодецGoor Молодец
си и си++(как с ним бороться)

Недавно всплыла одна тема* Вопрос такой: как поменять местами две переменные без помощи третьей(temporary) ?
В си проблем нет

.
.
.
int a, b;

a^=b^=a^=b; //в си все работает

//но в плюсах ни хренашки,а должна, кто знает как правильно записать?

//только не этот вариант, а именно первый...
a=a+b;
b=a-b;
a=a-b;
__________________
Системных администраторов нужно убивать еще в маленьком возрасте, когда они еще только "ламеры" (посвящено другу)
В.И.Ленин(Письмо к Фейрбаху, Том12)
Goor вне форума  
Старый 31.08.2002, 04:54     # 2
helldomain
Administrator
 
Аватар для helldomain
 
Регистрация: 13.05.2002
Сообщения: 11 227

helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
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?
helldomain вне форума  
Старый 01.09.2002, 11:25     # 3
FuzzyLogic
Guest
 
Сообщения: n/a

a=a^b; b=a^b;a=a^b;

На самом деле есть еще несколько способов решить эту задачку, но этот по видимости самый эффективный.
 
Старый 03.09.2002, 13:23     # 4
@ndrew
Guest
 
Сообщения: n/a

По поводу еффективности - готов поспорить Единственное его преимушество - не задействованость дополнительнои памяти дата сегмента. Можешь проверить сгенерированный асм код
Теперь о данной операции в принципе. Задача поставлена не корректно: переменные должны быть одного типа ! Иначе получаем то, что получаем Етот подвох, кстати, используйется часто при собеседованиях
 
Старый 03.09.2002, 14:25     # 5
FuzzyLogic
Guest
 
Сообщения: n/a

Зачем спорить, кидай другие методы и сравним
А про корректность, будет придираться, мы ведь не на собеседовании. Тем более, что в примере они объявлены одинаково, да и вообще, если переменные разных типов, скажем int и float, то как ты их не меняй, хоть с помощью 3-ей переменной, хоть 4-ой, всё равно без приведения типов float в int не запихать, хоть ты убейся :row:
 
Старый 03.09.2002, 14:48     # 6
@ndrew
Guest
 
Сообщения: n/a

FuzzyLogic
прав на все 100 )
 
Старый 03.09.2002, 18:26     # 7
helldomain
Administrator
 
Аватар для helldomain
 
Регистрация: 13.05.2002
Сообщения: 11 227

helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
Izwraschenci ;-))) wremen programmirowaniya na C s kompjuterom Mikrosha (ili Vist) ;-))).
helldomain вне форума  
Старый 04.09.2002, 03:18     # 8
vityok
Guest
 
Сообщения: n/a

Goor
Может в C он не использует определённую временную переменную(3-ию) но точно пользуется дополнительной памятью или стёком для сохранения.Исключением может быть использование команды XCHG для каждого байта в структуре данных.Но это применимо для однотипных данных.Для чисел разных типов(я больше на паскале сидел) к примеру integer(в c++ int) и real(действительные числа) число типа integer можно вставить в переменную типа real но не наоборот.Так что для замены требуется что-бы данные были однотипными иначе нужно будет менять тип одной из переменных или создавать 3-ию временную переменную.
 
Старый 04.09.2002, 03:59     # 9
helldomain
Administrator
 
Аватар для helldomain
 
Регистрация: 13.05.2002
Сообщения: 11 227

helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
Ne dumaju, chto-bi kompailer optimizirowal takoe wirajenie kak pod XCHG...
helldomain вне форума  
Старый 05.09.2002, 00:33     # 10
Goor
Модератор
 
Регистрация: 08.07.2002
Адрес: Germany
Сообщения: 397

Goor МолодецGoor МолодецGoor Молодец
Люд-д-и-и-и-и!!!
Ну вот проспал самое интересное.

Ладненько, все это конечно хорошо , но есть несколько "но"

В самом начале я сказал, что в Си это действительно работает, по крайней мере этот вариант

a^=b^=a^=b;
а вот визуальный ли это обман или нет это второя сторона вопроса
Что касается второго варианта,

a=a+b;
b=a-b;
a=a-b;

это чистая фикция потому что в этом примере он работает далеко не всегда, по одной простой причине , это то что у int есть предел и сумма "а" и "b" может выйти за эти пределы
Но вопрос был другой как первый вариант осуществить в Си++
__________________
Системных администраторов нужно убивать еще в маленьком возрасте, когда они еще только "ламеры" (посвящено другу)
В.И.Ленин(Письмо к Фейрбаху, Том12)
Goor вне форума  
Старый 05.09.2002, 03:35     # 11
helldomain
Administrator
 
Аватар для helldomain
 
Регистрация: 13.05.2002
Сообщения: 11 227

helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
Nu znaesh-li, kto tebya prosit ispolzowat int??? Takie weschi nado delat s zapasom.
helldomain вне форума  
Старый 05.09.2002, 10:40     # 12
Goor
Модератор
 
Регистрация: 08.07.2002
Адрес: Germany
Сообщения: 397

Goor МолодецGoor МолодецGoor Молодец
helldomain
no wed u "sapasa " tosge est predel.... ili?
__________________
Системных администраторов нужно убивать еще в маленьком возрасте, когда они еще только "ламеры" (посвящено другу)
В.И.Ленин(Письмо к Фейрбаху, Том12)
Goor вне форума  
Старый 05.09.2002, 13:13     # 13
@ndrew
Guest
 
Сообщения: n/a

Тема для обсуждения, однако....
У любого вычисления есть предел и его закладывает программист, насколько я ето понимаю
Если ето теоретический вопрос - то ответ уже был дан уважаемым FuzzyLogic. Если же нет, и ето вопрос "оптимизации", то ето просто изврашение IMHO...
 
Старый 05.09.2002, 15:28     # 14
helldomain
Administrator
 
Аватар для helldomain
 
Регистрация: 13.05.2002
Сообщения: 11 227

helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
Nu tak naznachai takoi zapas, kotorogo hwatit...
helldomain вне форума  
Старый 12.09.2002, 21:42     # 15
coho
Newbie
 
Регистрация: 05.06.2002
Адрес: СПб
Сообщения: 6

coho Путь к славе только начался
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.
coho вне форума  
Старый 13.09.2002, 01:50     # 16
helldomain
Administrator
 
Аватар для helldomain
 
Регистрация: 13.05.2002
Сообщения: 11 227

helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
Wpolne wozmojno, no tolko u menya pri maksimalnoi optimizacii C generilo kod s pamyatju. Bez XOR.
helldomain вне форума  
Старый 13.09.2002, 01:50     # 17
helldomain
Administrator
 
Аватар для helldomain
 
Регистрация: 13.05.2002
Сообщения: 11 227

helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
Wpolne wozmojno, no tolko u menya pri maksimalnoi optimizacii C generilo kod s pamyatju. Bez XOR.
helldomain вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 14:15.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.