Обмен значений двух переменных


Несколько способов обмена значений переменных на классическом языке C.
Наиболее интересен способ обмена значений двух целочисленных
переменных без использования третьей вспомогательной переменной -
swap4() - развивает мозги.

#include <stdio.h>

void swap1(int a, int b)
{
    int c = a;
    a = b;
    b = c;
}

void swap2(int &a, int &b)
{
    int c = a;
    a = b;
    b = c;
}

void swap3(int *a, int *b)
{
    int c = *a;
    *a = *b;
    *b = c;
}

void swap4(int &a, int &b)
{
    a=a+b;
    b=a-b;
    a=a-b;
}

template <class T>
void swap5(T &a, T &b)
{
  int c = a;
  a = b; b = c;
}

int main()
{
    int x = 10;
    int y = 20;
    printf("x=%d, y=%d\n",x,y);
    swap1(x,y);   // 10, 20
    swap2(x,y);   // 20, 10
    swap3(&x,&y); // 10, 20
    swap4(x,y);   // 20, 10
    swap5(x,y);   // 10, 20
    printf("x=%d, y=%d\n",x,y);
    return 0;
}