обмен значений 2ух переменных без использования третей
От: pofig  
Дата: 05.05.11 12:27
Оценка:
доброго времени...
столкнулся со следующей проблемой:
не работает трюк с XOR для элементов массива

int arr[2] = {5, 7};

int i = 0;
arr[i] ^= arr[i+1] ^= arr[i] ^= arr[i+1]; // 1


После этого вместо {7, 5} в массиве лежит {0, 5} (в частности для g++).
Но, если расписать строку 1 в три, то все нормально.

В чем моя ошибка?
спасибо.
Re: обмен значений 2ух переменных без использования третей
От: OdesitVadim Украина  
Дата: 05.05.11 12:46
Оценка:
Здравствуйте, pofig, Вы писали:

P>доброго времени...

P>столкнулся со следующей проблемой:
P>не работает трюк с XOR для элементов массива
а если явно расставить скобки?
arr[i] ^= (arr[i+1] ^= (arr[i] ^= arr[i+1]));
Re: обмен значений 2ух переменных без использования третей
От: dilmah США  
Дата: 05.05.11 12:57
Оценка: 1 (1) +4
P>arr[i] ^= arr[i+1] ^= arr[i] ^= arr[i+1]; // 1

так это ж UB.
между последовательными sequence points нельзя 2 раза менять значение одного объекта
Re: обмен значений 2ух переменных без использования третей
От: uzhas Ниоткуда  
Дата: 05.05.11 13:18
Оценка:
Здравствуйте, pofig, Вы писали:

P>доброго времени...

P>столкнулся со следующей проблемой:
P>не работает трюк с XOR для элементов массива
опачки: http://ideone.com/3CcPa
ну а вообще, это UB, так что будте осторожны
Re[2]: обмен значений 2ух переменных без использования трете
От: Ops Россия  
Дата: 06.05.11 00:45
Оценка: -1
Здравствуйте, dilmah, Вы писали:

P>>arr[i] ^= arr[i+1] ^= arr[i] ^= arr[i+1]; // 1


D>так это ж UB.

D>между последовательными sequence points нельзя 2 раза менять значение одного объекта
Ну вот хоть ты тресни, нет тут UB (оператор =, +-*/= — сами по себе точки следования., а написал это троль, поймай и суши на керосинке.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[3]: обмен значений 2ух переменных без использования трете
От: uzhas Ниоткуда  
Дата: 06.05.11 06:00
Оценка: +2
Здравствуйте, Ops, Вы писали:


Ops>Ну вот хоть ты тресни, нет тут UB

я с вами не согласен, рекомендую к прочтению http://stackoverflow.com/questions/1860461/why-is-i-i-1-unspecified-behavior

Ops>(оператор =, +-*/= — сами по себе точки следования.,

это верно только для user-defined операторов. для встроенных это неверно
Re[3]: обмен значений 2ух переменных без использования трете
От: rg45 СССР  
Дата: 06.05.11 06:07
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Ну вот хоть ты тресни, нет тут UB (оператор =, +-*/= — сами по себе точки следования., а написал это троль, поймай и суши на керосинке.


Согласно п. 1.9 стандарта точки следования имеют место:
  1. Вконце полного выражения (точка с запятой);
  2. В точке входа в функцию, после вычисления всех ее аргументов;
  3. После выхода из функции;
  4. В операторах: "&&", "||", "?:", ",".

Как видишь, об операторах присваивания ни слова. Да и достаточно вспомнить уже набивший оскомину пример: i = i++; — был бы оператор присваивания точкой следования, здесь не возникало бы UB.
--
Не можешь достичь желаемого — пожелай достигнутого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.