Да вроде всегда была определена последовательность
вычислений, но не последовательность
записи результатов.
Так как значением выражения
(a = B) является не «содержимое
а после записи», а «значение
b приведенное к неквалифицированному типу
а».
А
(a ^= B) это «то же, что и
(a = a ^ B), за исключением того, что a оценивается один раз»
А порядок записи в пределах между точками следования неопределён.
Но что-то меня LWS поколебал...
http://liveworkspace.org/code/Ll7BX$13gcc по 4.6.3 выдаёт
Цитата
source.cpp:7:20: warning: operation on 'a' may be undefined [-Wsequence-point]
в режимах и C, и C++, gcc 4.7.2 только в режиме C, но не в C++
clang 3.2 доволен всем.
Для меня это новость. Первое (и последнее -- больше так не баловался) предупреждение на
a ^= b ^= a ^= b; я получил как бы не от BCC5 уже не помню как давно. Почитал стандарт. Вроде понял :-)
Что касается
*beg += *end - (*end = *beg);, то все компиляторы единодушны -- UB (undefined behavior).
Цитата(Буратино @ Jan 25 2013, 14:58)

что такое UB? что такое в пределах sequence point?
«тут мне кажется», что Вы рано за такие оптимизации взялись :-)
Sequence_point популярно для начала.