Причина этого в том, что вы передаете значения по ссылке в функции swap ().
Предположим, что M [1] [1] = 5.
Когда вы передаете M [1] [1] в swap (), они не скопированы в a и b.Вместо этого a и b становятся псевдонимом для M [1] [1].
Давайте попробуем понять, что происходит, шаг за шагом:
a=a+b; // equivalent to M[1][1] = M[1][1] + M[1][1];
Когда вы сделаете это, послеоперации, M [1] [1] становится 10. Поскольку a & b являются псевдонимами M [1] [1], a и b также становятся 10.
b=a-b; // equivalent to M[1][1] = M[1][1] - M[1][1];
Когда вы делаете это, M [1] [1] становится 0. Поскольку a & b являются псевдонимами M [1] [1], a и b также становятся 0.
a=a-b; // equivalent to M[1][1] = M[1][1] - M[1][1];
Когда вы это сделаете, M [1] [1] становится 0. Поскольку a & b являются псевдонимами M [1] [1], a и b также становятся 0.
Редактировать:
Как предложено @SidS, вы можете использовать библиотечную функцию std::swap()
.Если вы хотите исправить свой код, просто измените swap () следующим образом:
void swap( int &a, int &b )
{
int tmp = a;
a = b;
b = tmp;
}