<pre name="code" class="cpp">
<pre name="code" class="cpp">
浅谈两数值交换
一.问题分析:
基于这个问题我们可以采用创建临时值和直接对两数进行运算两种方式去解决问题.小编就不啰嗦了,直接贴代码和大家分享喽!
1)创建临时值
(1)方式一:传值方式(不可取方式)
void _swap1(int x,int y)
{
int tmp=x; //tmp为临时值,后面不再说明
x=y;
y=tmp;
}
int main()
{
int a=1;
int b=0;
_swap1(a,b);
cout<<"a="<<a<<" "<<"b="<<b<<endl;
getchar();
return 0;
}
运行结果:当我们对代码进行测试时发现,a和b值并没有发生交换,调试时发现:函数只对形参的值进行了交换,我们传入的实参值并没有发生变化,因为每个形参的地址和与其对应的每个实参的地址是彼此独立的,该方法不可取。(下图可得出结论)
(2)方式二:传指针方式,交换指针变量值方式
void _swap2(int* x,int* y)
{
int tmp=*x;
*x=*y;
*y=tmp;
}
采用这种方式我们发现,两值进行了交换,因为我们传入的是实参的地址,在内存中实参会随形参的值变化而变化;(下图可得出结论)(3)方式三:传指针方式,交换指针方式
void _swap3(int* x,int* y)
{
int *tmp=x;
x=y;
y=tmp;
}
(4)方式四:传引用方式void _swap4(int& x,int& y)
{
int tmp=x;
x=y;
y=tmp;
}
2)不创建临时值
(1)方式一:两值加减法运算
void _swap5(int& x,int& y)
{
x=x+y;
y=x-y;
x=x-y;
}
对这种方法,我们减少了创建临时值的麻烦,但是,当我们进行较大数据的交换时,上面的加法运算会产生位溢出,因此我们可以采用下面的位运算对其交换. (2)方式二:两值位运算
void _swap6(int& x,int& y)
{
x=x^y;
y=x^y;
x=x^y;
}
那么就到这里,