Это уравнение свопирует два числа без временной переменной, но использует арифметические операции:
a = (a+b) - (b=a);
Как я могу это сделать без арифметических операций? Я думал о XOR.
Это уравнение свопирует два числа без временной переменной, но использует арифметические операции:
a = (a+b) - (b=a);
Как я могу это сделать без арифметических операций? Я думал о XOR.
В C это должно работать:
a = a^b;
b = a^b;
a = a^b;
ИЛИ кулер /geekier, смотрящий:
a^=b;
b^=a;
a^=b;
Подробнее см. this. XOR - очень мощная операция, у которой есть много интересных обычаев, возникающих здесь и там.
a=a+b;
b=a-b;
a=a-b;
Это просто, но эффективно....
Почему бы не использовать std libs?
std::swap(a,b);
		Лучший способ обмена двумя номерами без использования временных операций или арифметических операций - загрузить обе переменные в регистры, а затем использовать регистры по-другому!
Вы не можете сделать это непосредственно из C, но компилятор, вероятно, вполне способен его решить (по крайней мере, если оптимизация включена) - если вы пишете простой, очевидный код, например, который предложил KennyTM в своем комментарии.
например.
void swap_tmp(unsigned int *p)
{
  unsigned int tmp;
  tmp = p[0];
  p[0] = p[1];
  p[1] = tmp;
}
 скомпилированный с gcc 4.3.2 с флагом оптимизации -O2, дает:
swap_tmp:
        pushl   %ebp               ;  (prologue)
        movl    %esp, %ebp         ;  (prologue)
        movl    8(%ebp), %eax      ; EAX = p
        movl    (%eax), %ecx       ; ECX = p[0]
        movl    4(%eax), %edx      ; EDX = p[1]
        movl    %ecx, 4(%eax)      ; p[1] = ECX
        movl    %edx, (%eax)       ; p[0] = EDX
        popl    %ebp               ;  (epilogue)
        ret                        ;  (epilogue)
		Я раньше не видел этого решения C, но я уверен, что кто-то подумал об этом. И, возможно, было больше сообщений самоконтроля, чем я.
fprintf(fopen("temp.txt", "w"), "%d", a);
a = b;
fscanf(fopen("temp.txt", "r"), "%d", &b);
Никаких дополнительных переменных!
Он работает для меня, но в зависимости от реализации stdio вам, возможно, придется что-то делать с буферизацией вывода.
Использование XOR,
void swap(int &a, int &b)
{
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
}
Один вкладыш с XOR,
void swap(int &a, int &b)
{
    a ^= b ^= a ^= b;
}
Эти методы кажутся чистыми, потому что они не терпят неудачу для любого тестового случая, но опять же, поскольку (как в методе 2) значение переменной дважды изменяется в пределах одной и той же точки последовательности, считается, что она имеет undefined, объявленное ANSI C.
a = ((a = a + b) - (b = a - b));
В дополнение к приведенным выше решениям для случая, когда если одно из значений вне диапазона для знакового целого числа, значения двух переменных могут быть заменены таким образом
a = a+b;
b=b-(-a);
a=b-a;
b=-(b);
		 C++11 позволяет:
Простое решение, которое я помню из моих бакалавров :-)
a = a+b-(b=a);
 		Просто используйте что-то еще, например. переменная, которая не является временной. Например,
int main (int argc, char** argv) {
   int a = 5; int b = 6;
   argc = a; a = b; b = argc;
}
В конце концов, вопрос не в том, чтобы показать разумный способ сделать это (c=a;a=b;b=c). Это, чтобы показать, что вы можете придумать из коробки или хотя бы скопировать ответ другого, кто может.
Также можно использовать умножение и деление.
 int x = 10, y = 5;
 // Code to swap 'x' and 'y'
 x = x * y;  // x now becomes 50
 y = x / y;  // y becomes 10
 x = x / y;  // x becomes 5