浅谈C/C++中交换数值的函数方法
学习C++的过程中遇到过很多坑,其中有一个坑就是交换变量的值。通过网上的学习,总结出来几个常用的方法。
1.不封装函数,直接在main函数中实现交换。
#include <iostream>
using namespace std;
int main()
{
int a=1,b=2,c;
c=a;
a=b;
b=c;
cout<<a<<" "<<b<<endl;
return 0;
}
输出结果:
2 1
2.申请全局变量,通过封装函数实现交换,没有形参。
#include <iostream>
using namespace std;
int a=1,b=2,c;
int swap();//函数声明
int main()
{
swap();
cout<<a<<" "<<b<<endl;
return 0;
}
int swap()
{
c=a;
a=b;
b=c;
return 0;
}
输出结果:
2 1
在这里,由于申请的是全局变量,所以在swap函数执行完的时候并没有释放变量a和变量b的内存。
3.申请局部变量,在封装函数添加引用来实现交换。
#include <iostream>
using namespace std;
int swap(int &,int &);//函数声明
int main()
{
int a=1,b=2;
swap(a,b);
cout<<a<<" "<<b<<endl;
return 0;
}
int swap(int &m,int &n)
{
int temp;
temp=m;
m=n;
n=temp;
return 0;
}
输出结果:
2 1
这里的&a,&b不是取地址的意思,是引用,即用m来代替整型变量a,相当于给整型变量a取了一个别名m;用n来代替整型变量b,相当于给整型变量b取了一个别名n。在函数swap执行完时并不会释放变量a和b的内存,所以能够实现数值交换。
***4.申请局部变量,在封装函数添加整型形参来实现交换。***
#include <iostream>
using namespace std;
int swap(int ,int );//函数声明
int main()
{
int a=1,b=2;
swap(a,b);
cout<<a<<" "<<b<<endl;
return 0;
}
int swap(int m,int n)
{
int swap;
swap=m;
m=n;
n=swap;
return 0;
}
输出结果:
1 2
注意:这个做法的结果是不成功的,原理看似没问题,但仔细分析发现,变量m和变量n是局部变量,而在调用swap函数时,实际上是把整型变量a和b的值传给形式参数m和n,而swap函数执行完后,局部变量m和n都会被释放掉内存。实际上变量a和变量b并没有做到数值交换。这也是实现这个功能函数时最大的坑。改进的方法是用引用的方法。
5.在封装函数添加指针形参来实现交换。
#include <iostream>
using namespace std;
int swap(int *,int *);//必须声明,不然会报错
int main()
{
int a=1,b=2;
swap(&a,&b);
cout<<a<<" "<<b<<endl;
return 0;
}
int swap(int *m,int *n)
{
int temp;
temp=*m;
*m=*n;
*n=temp;
return 0;
}
输出结果:
2 1
这个函数实现变量之间数值交换,采用的是通过变量的地址去访问变量的值,变量的地址在局部函数执行完以后不会被释放。
6.不采用中间变量的方式。
#include <iostream>
using namespace std;
int swap(int &,int &)
int main()
{
int a=1,b=2;
swap(a,b);
cout<<a<<" "<<b<<endl;
return 0;
}
int swap(int &a,int &b)
{
a=a+b;
b=a-b;
a=a-b;
return 0;
}
输出结果:
2 1