Если у вас есть 2 переменные a и b : (каждая переменная занимает свой адрес памяти)
a = a xor b
b = a xor b
a = a xor b
Существуют и другие варианты этой проблемы, но они не пройдут, если произойдет переполнение:
а = а + Ь
B = A-B
а = а-б
а = а * Ь
Ь = а / Ь
а = а / б
Варианты «плюс» и «минус» могут работать, если у вас есть пользовательские типы, у которых есть операторы + и -, которые имеют смысл.
Примечание. Во избежание путаницы, если у вас есть только 1 переменная и 2 ссылки или указатели на нее, все вышеперечисленное завершится ошибкой. Проверка должна быть сделана, чтобы избежать этого.
В отличие от многих людей, не имеет значения, если у вас есть 2 разных числа. Имеет значение только то, что у вас есть две разные переменные, число которых существует в двух разных адресах памяти.
т.е. это совершенно верно:
int a = 3;
int b = 3;
a = a ^ b;
b = a ^ b;
a = a ^ b;
assert(a == b);
assert(a == 3);