Здравствуйте, pofig, Вы писали:
P>доброго времени... P>столкнулся со следующей проблемой: P>не работает трюк с XOR для элементов массива
а если явно расставить скобки?
arr[i] ^= (arr[i+1] ^= (arr[i] ^= arr[i+1]));
Re: обмен значений 2ух переменных без использования третей
Здравствуйте, pofig, Вы писали:
P>доброго времени... P>столкнулся со следующей проблемой: P>не работает трюк с XOR для элементов массива
опачки: http://ideone.com/3CcPa
ну а вообще, это UB, так что будте осторожны
Re[2]: обмен значений 2ух переменных без использования трете
Здравствуйте, dilmah, Вы писали:
P>>arr[i] ^= arr[i+1] ^= arr[i] ^= arr[i+1]; // 1
D>так это ж UB. D>между последовательными sequence points нельзя 2 раза менять значение одного объекта
Ну вот хоть ты тресни, нет тут UB (оператор =, +-*/= — сами по себе точки следования., а написал это троль, поймай и суши на керосинке.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[3]: обмен значений 2ух переменных без использования трете
Здравствуйте, Ops, Вы писали:
Ops>Ну вот хоть ты тресни, нет тут UB (оператор =, +-*/= — сами по себе точки следования., а написал это троль, поймай и суши на керосинке.
Согласно п. 1.9 стандарта точки следования имеют место: Вконце полного выражения (точка с запятой);
В точке входа в функцию, после вычисления всех ее аргументов;
После выхода из функции;
В операторах: "&&", "||", "?:", ",".
Как видишь, об операторах присваивания ни слова. Да и достаточно вспомнить уже набивший оскомину пример: i = i++; — был бы оператор присваивания точкой следования, здесь не возникало бы UB.
--
Не можешь достичь желаемого — пожелай достигнутого.