так, как вы его написали, это неопределенное поведение. Это связано с тем, что вы изменяете переменную более одного раза в одной и той же точке последовательности. Однако, если вы перепишите его следующим образом:
m ^= n;
n ^= m;
m ^= n;
тогда это безопасно. Однако «полезным» является еще один вопрос, он редко «полезен», а иногда он на самом деле медленнее, чем на самом деле, используя temp!
Также вам нужно быть осторожным с наложением (указатели/ссылки), потому что, если вы попытаетесь что-то поменять с собой, вы в конечном итоге случайно обнулите свою ценность. Например:
#define SWAP(m, n) { m ^= n; n ^= m; m ^= n; }
int x[] = { 1, 2, 3, 4 };
int i = 0;
int j = 0;
SWAP(x[i], x[j]); // whoops, x[0] == 0 now, not 1!
более традиционная реализация свопа не имеет этой проблемы.
Нет, это не так. Здесь вы найдете: http://stackoverflow.com/questions/3741440/potential-problem-in-swapping-values-of-two-variables-without-using-a-third-vari/3741450 – codaddict