Re[5]: поменять местами A и B
От: VVV Россия  
Дата: 10.06.02 10:32
Оценка:
Здравствуйте Андрей Тарасевич, Вы писали:

АТ>Здравствуйте VVV, Вы писали:


АТ>>>>Старый избитый прикол


АТ>>>>
АТ>>>>a ^= b ^= a ^= b;
АТ>>>>


АТ>>>>Разумеется, работать это будет только для некоторых типов.


АТ>>>Хотя, если посмотреть на это внимательнее, то становится ясно, что за такое морду бить надо. Две модификации каждой переменно в рамках одного выражения — неопределенное поведение.


АТ>>>Правильнее так


АТ>>>
АТ>>>b ^= a; a ^= b; b ^= a;
АТ>>>


VVV>>Разве и в операторе присваивания будет неопределённое поведение??? Разве не говорится, что сначала вычисляется правая часть и затем присваивается левой? Пожалуйста, дайте выдержку из стандарта где такое использование оператора присваивания считается неопределённым.


АТ>Любое выражениие, в котором одна и таже переменная встроенного типа модифицируется более одного раза между парой соседних точек следования, порождает неопределенное поведение. См. пункт 5/4 стандарта языка C++. А какой там оператор значения не имеет. Мой первый вариант страдал именно это проблемой.


Т.е. нижеследующая строка приводит к неопределённому поведению?

a=b=a=b=a=b=1;

(просто хочу, чтобы ты сам понял, что нет здесь никакого неопределённого поведения, что значение (результат) оператора присваивания (не рассматриваем переопределённое присваивание) есть результат выражения правой части (приведённый, конечно, к типу переменной слева)).

и в выражении a ^= b ^= a ^= b; операторы присваивания будут выполняться справа налево (в соответствии со стандартом) с полностью определённым поведением.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.