PDA

Просмотр полной версии : си и си++(как с ним бороться)


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.