您的位置:首页 > 编程语言 > C语言/C++

关于两个变量不使用临时变量进行值交换

2014-08-30 19:51 295 查看
最近,由于工作需要重温了一下数据结构与算法分析。针对“两个变量不使用临时变量进行值交换”这个问题,进行了一定的分析与研究。

首先,需要确定的是这个问题的应用条件。

从数据类型的角度可以分为相同数据类型和不同数据类型变量的值交换。这里的数据类型不包括结构体,类,枚举及联合体等复合类型,应该局限在内部数据类型。

1. 对于相同数据类型的情况,我们希望如下情况:

Type1 a= Val1;

Type1 b= Val2;

swap(&a, &b);

在交换之后有:a = Val2,b = Val1。

2. 对于不同数据类型的情况,我们希望如下情况:

Type1 a= Val1;

Type2 b= Val2;

swap(&a, &b);

在交换之后有:a = (type1)Val2,b = (type2)Val1。

但对于不同数据类型又分为同字长和非同字长两种情况,显然非同字长的变量交换会出现数据截断的情况,交换也就变得毫无意义。同字长情况下,对于整型与非整型交换依然会存在数据截断的情况,即便是同字长整型又分为有符号和无符号,二进制数据是可以实现交换的,但会存在某个类型溢出的情况,使交换也变得无意义。

综上:这两个变量应该是相同的数据类型,否则进行值的交换就会变得毫无意义或者意义不大。

其次,解决这个问题的方法有两种。

1. 针对同类型的整型及浮点型数据都适用的为:

x = x + y;

y = x - y;

x = x - y;

2. 只对同类型的整型数据适用的为:

x = x ^ y;

y = x ^ y;

x = x ^ y;

综上,以上两种方法都不会因数据溢出产生错误。第二种方法由于异或运算“^”支持整型运算,所以不适用于浮点型,因为编译器会报错。第二种方法在数据结构的指针操作方面有着存储空间优势。

最后,这个问题的深入探讨坛子里有几个帖子大家可以去查阅,问题真正的解法可能有多种多样,本篇结论纯属一家之言,希望对大家有帮助,如果觉得满纸荒唐言,只当博君一笑尔!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c c++ 算法
相关文章推荐