数值交换

  • 格式:doc
  • 大小:31.00 KB
  • 文档页数:2

数值交换
如果一个函数要修改传入参数的值,直接传值是不行的。

因为这样只是在函数的栈中复制了参数的值,并没有修改实际的参数值。

在C中可以通过将参数声明为指针类型达到目的。

而在C++中,又多了一种选择,就是可以将参数声明为引用类型,实际上引用就是某种意义上得安全指针。

例题:将数a,b的值进行交换,并且不适用任何中间变量。

考点:两个变量值得交换方法。

出现频率:★★★★
1#include<stdio.h>
2
3void swap1(int &a,int &b)
4{
5int temp=a; //适用局部变量temp完成交换
6a=b;
7b=temp;
8};
9
10void swap2(int &a,int &b)
11{
12a=a+b;
13b=a-b;
14a=a-b;
15};
16
17void swap3(int &a,int&b)
18{
19a^=b; // a^=b 等价于a=a^b
20b^=a;
21a^=b;
22};
23
24int main(void)
25{
26int a1=1,b1=2;
27int a2=3,b2=4;
28int a3=5,b3=6;
29int a=2147483647,b=1;
30
31swap1(a1,b1); //测试使用临时变量进行交换的版本
32swap2(a2,b2); //测试使用加减运算进行交换的版本
33swap3(a3,b3); //测试使用异或运算进行交换的版本
34
35printf(“after swap…\n”);
36printf(“a1=%d,b1=%d\n”,a1,b1);
37printf(“a2=%d,b2=%d\n”,a2,b2);
38printf(“a3=%d,b3=%d\n”,a3,b3);
39
40swap2(a,b);
41printf(“a=%d,b=%d\n”,a,b);
42
43return 0;
44}
解析:
以上的C++程序中友3个swap函数,都是采用引用的传参的方式。

■swap1()采用的是教科书里常见的方式,用一个局部变量temp保存其中一个值来达到交换目的。

当然,这种方式不是本题要求的答案。

■swap2()采用的是一种简单的加减算法来达到交换a,b的目的。

这种方式的缺点是做“a+b”和“a-b”运算时可能会导致数据溢出。

■swap3()采用了按位异或的方式交换a,b。

按位异或运算符“^”的功能是将参与运算的两数各对应的二进制为相异或,如果对应的二进制位相同,则结果为0,否则结果为1。

这样运算3次即可交换a,b的值。

代码第31行~第33行调用3种swap函数。

注意40行的调用,在swap2函数栈中的运算会有数据溢出发生。

我们知道在32位平台下int占4个字节内存,其范围是-2147483648~2147483647,因此2147483647加1就变成了-2147483648。

不过通过运行结果我们可以看到,虽然产生了溢出,但是交换操作依然是成功的。

答案
after swap…
a1=2,b1=1
a2=4,b2=3
a3=6,b3=5
a=1,b=2147483647
注意:
采用程序代码中swap2和swap3的交换方式,swap2有可能发生数据溢出的缺点。

相比较swap2,推荐swap3采用的按位异或的方式。