Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Здравствуйте 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; операторы присваивания будут выполняться справа налево (в соответствии со стандартом) с полностью определённым поведением.