IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   си и си++(как с ним бороться) (http://www.imho.ws/showthread.php?t=10182)

Goor 30.08.2002 06:29

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

.
.
.
int a, b;

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

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

//только не этот вариант, а именно первый...
a=a+b;
b=a-b;
a=a-b;

helldomain 31.08.2002 04:54

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?

FuzzyLogic 01.09.2002 11:25

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

На самом деле есть еще несколько способов решить эту задачку, но этот по видимости самый эффективный.

@ndrew 03.09.2002 13:23

По поводу еффективности - готов поспорить :) Единственное его преимушество - не задействованость дополнительнои памяти дата сегмента. Можешь проверить сгенерированный асм код :)
Теперь о данной операции в принципе. Задача поставлена не корректно: переменные должны быть одного типа ! Иначе получаем то, что получаем :) Етот подвох, кстати, используйется часто при собеседованиях :)

FuzzyLogic 03.09.2002 14:25

Зачем спорить, кидай другие методы и сравним :)
А про корректность, будет придираться, мы ведь не на собеседовании. ;) Тем более, что в примере они объявлены одинаково, да и вообще, если переменные разных типов, скажем int и float, то как ты их не меняй, хоть с помощью 3-ей переменной, хоть 4-ой, всё равно без приведения типов float в int не запихать, хоть ты убейся :) :row:

@ndrew 03.09.2002 14:48

FuzzyLogic
прав на все 100 :))

helldomain 03.09.2002 18:26

Izwraschenci ;-))) wremen programmirowaniya na C s kompjuterom Mikrosha (ili Vist) ;-))).

vityok 04.09.2002 03:18

Goor
Может в C он не использует определённую временную переменную(3-ию) но точно пользуется дополнительной памятью или стёком для сохранения.Исключением может быть использование команды XCHG для каждого байта в структуре данных.Но это применимо для однотипных данных.Для чисел разных типов(я больше на паскале сидел) к примеру integer(в c++ int) и real(действительные числа) число типа integer можно вставить в переменную типа real но не наоборот.Так что для замены требуется что-бы данные были однотипными иначе нужно будет менять тип одной из переменных или создавать 3-ию временную переменную.

helldomain 04.09.2002 03:59

Ne dumaju, chto-bi kompailer optimizirowal takoe wirajenie kak pod XCHG...

Goor 05.09.2002 00:33

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

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

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

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

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

это чистая фикция потому что в этом примере он работает далеко не всегда, по одной простой причине , это то что у int есть предел и сумма "а" и "b" может выйти за эти пределы
Но вопрос был другой как первый вариант осуществить в Си++

helldomain 05.09.2002 03:35

Nu znaesh-li, kto tebya prosit ispolzowat int??? Takie weschi nado delat s zapasom.

Goor 05.09.2002 10:40

helldomain
no wed u "sapasa " tosge est predel.... ili?

@ndrew 05.09.2002 13:13

Тема для обсуждения, однако....
У любого вычисления есть предел и его закладывает программист, насколько я ето понимаю :)
Если ето теоретический вопрос - то ответ уже был дан уважаемым FuzzyLogic. Если же нет, и ето вопрос "оптимизации", то ето просто изврашение :) IMHO...

helldomain 05.09.2002 15:28

Nu tak naznachai takoi zapas, kotorogo hwatit...

coho 12.09.2002 21:42

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.

helldomain 13.09.2002 01:50

Wpolne wozmojno, no tolko u menya pri maksimalnoi optimizacii C generilo kod s pamyatju. Bez XOR.

helldomain 13.09.2002 01:50

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.