У меня нет фактического ответа, но я не думаю, что проблема в приоритете. Добавив скобки для уточнения, происходит то же самое:
// 3 2 1
x^=(y^=(x^=y));
То, что я ожидал бы , ожидал , что-то эквивалентное:
x^=y; //1: xor x with y, update x, return the new x;
y^=x; //2: xor y with (result of 1), update y, return the new y;
x^=y; //3: xor x with (result of 2), update x, return the new x;
На самом деле, я думаю, что используются начальные значения, что фактически означает:
x0 = x;
y0 = y;
x = x0^y0^x0^y0; //0
y = y0^x0^y0; //15
Проблема в том, что я не уверен, где в спецификации языка я могу найти это. Самое близкое, к чему я пришел, было:
15.7.2 Оценка операндов перед операцией
Язык программирования Java также гарантирует, что каждый операнд оператора (кроме
условные операторы &&, || и? :), кажется, полностью оценен
перед выполнением любой части самой операции.