Обсуждение:XOR-обмен

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

"Если бы в PDP-11 такая инструкция была включена, то возможно, что язык Си имел бы возможность обмена переменных как основной бинарный оператор."

Это спекуляция, кажется? --Dennis714 11:19, 5 июня 2010 (UTC)[ответить]

XorSwap(var1, var1)[править код]

X := 2;// 0b0010
Y := 2;// 0b0010
X := X xor Y;// X=0 (0b0000), Y=2 (0b0010)
Y := Y xor X;// X=0 (0b0000), Y=2 (0b0010)
X := X xor Y;// X=2 (0b0010), Y=2 (0b0010)

Алгоритм выполнился верно. Значит то предостережение лишнее? kemal 17:22, 23 ноября 2010 (UTC)[ответить]

Отнюдь, выполнять-то надо не "с равным значением", а "само с собой":

var1:=2;
XorSwap(var1, var1);
X := X xor Y;// var1=0
Y := Y xor X;// var1=0
X := X xor Y;// var1=0

Восстанавливаю предупреждение, "что-то" для точности заменяю на "переменную". Plainer 13:56, 26 ноября 2012 (UTC)[ответить]

Верно, или неверно, зависит от того, передаются параметры по значению или по ссылке. 83.237.227.82 15:44, 15 марта 2015 (UTC)[ответить]

int XorSwapRef( int& a, int& b); /* Здесь, как пишет Plainer, когда XorSwapRef(var1, var1), "выполнять надо само с собой". */

int XorSwapValue( int a, int b); /* здесь XorSwapValue(var1,var1) не приводит к ошибке */

int XorSwapValue( int a, int b); - здесь другая ошибка. Так как алгоритм применяется к копиям переменных, то вызов функции XorSwapValue( int a, int b) не изменит значения фактических параметров. 83.237.224.199 09:40, 23 марта 2015 (UTC)[ответить]

Часто встречающаяся ошибка в использовании этого алгоритма[править код]

См. правку 20 января 2015‎,"если некорректно, зачем об этом здесь писать".

В этой правке был удалён текст:

Часто встречается сокращённая запись:

x ^= (y ^= (x ^= y));

Такая запись, однако, некорректна: она эквивалентна

x = x ^ (y ^= (x ^= y)); Вычисления левого (x) и правого (y ^= (x ^= y)) операндов операции ^ не упорядочены по отношению друг к другу, причём левый операнд содержит чтение значения переменной x, а правый — связанный с переменной x побочный эффект. Согласно стандартам C/C++, это приводит к неопределённому поведению.

Цитирую со страницы обсуждения РоманСузи

Зачем? Для того, чтобы читатель знал, что это некорректно. Как Вы думаете, зачем в различных справочниках, учебниках встречаются разделы "Типичные ошибки"? 83.237.227.82 15:04, 15 марта 2015 (UTC)[ответить]

Пример. Справочник "Скользкие места C++" ( Год: 2006 Автор: Стефан К. Дьюхэрст ). Автор описывает несколько десятков часто встречающихся ошибок. Зачем он это делает? Зачем писать о возможных ошибках, если это ошибки? 83.237.227.82 15:36, 15 марта 2015 (UTC)[ответить]

  • Источник у Вас есть, что «Часто встречается сокращённая запись»? Впрочем, если убрать утверждение о частой встречаемости, то ничего против не имею. Может быть, ещё более явно дать, что код ошибочен: /* Ошибка! */. Ссылку на место в стандарте о неопределённом поведении тоже было бы хорошо добавить. РоманСузи 16:51, 15 марта 2015 (UTC)[ответить]