1、由于C语言是以传值的方式传递将参数值传递给被调函数,也就是说传递函数不能直接修改主调函数中的值。如以下的swap()函数则无法实现数值的交换。
void swap(int x, int y) /* WRONG */
{
int temp;
temp = x;
x = y;
y = temp;
}
2、正确的方式如下,转换的过程中具有以下几种:
swap(&a, &b)
{
//方法一:
int tmp = 0;
tmp = b;
b = a;
a = tmp;
//方法二:
//a = a+b;
//b = a-b;
//a = a -b;
//方法三:
//a ^= b ^= a ^= b;
//方法四:
<span style="color:#ff0000;">//a = a+b-(b=a); </span> //此时已经将a赋值给b,出现的运算会影响数值变化!
//方法五:用堆栈的方法
//push a
//push b
//pop a
//pop b
}
对于其中的方法三:
//a ^= b ^= a ^= b;
不同的编译器会有不同的结果,对于GCC编译器无法正确,但对于VC6.0还是可以实现的。
具体的流程如下:
a = 1 = 0001
b = 2 = 0010
a^=b^=a^=b; //对a修改了两次
先执行 a^=b
a = 0011
再执行 b^=a
b = 0001
最后执行a^=b,即 a = a^b
这里的a不一定会取到第一次修改后的0011
也可能取到第一次修改之前的0001
如果取修改之后的,则 a=0011^0001 = 2;
如果取修改之前的,则 a=0001^0001 = 0;
所以gcc和vc编译器的结论有所不同。