交换两个变量而不用临时变量
2011-01-24 17:24
323 查看
1: inline void Swap(int *a,int *b)
2: {
3: *a=*a+*b;
4: *b=*a-*b;
5: *a=*a-*b;
6: }
是不是很有意思,真的没有用到其它的临时变量啊!那我们上面的结论1是不是错了呢?当然不是,为什么可以直接就可以交换了呢?还是用上面的例子来说,两个人交换苹果和桔子但是每人只有一个手,也不借助其它的容器,那如何进行哟?有办法,就只是用一个手拿两样东西,也就是说先将苹果(桔子)给另一个人用一只手拿着,再从他手上拿桔子(苹果)。基本也就是代码的意思了。
结论2:看似不可能,但却可以的,要做的是仔细的去挖掘,多思考。
那上面的代码是不是就没有问题了?有。要考虑溢出的问题,程序中有一个加法,很可能使结果超出范围,也就是说一只手要是拿不了一个苹果和桔子怎样办?
要相信有问题是可以解决的,可以用assert等等方面处理一下,但不是最好,继续有如下的代码
1: inline void Swap(int *a, int *b)
2: {
3: *a ^= *b;
4: *b ^= *a;
5: *a ^= *b;
6: }
2: {
3: *a=*a+*b;
4: *b=*a-*b;
5: *a=*a-*b;
6: }
是不是很有意思,真的没有用到其它的临时变量啊!那我们上面的结论1是不是错了呢?当然不是,为什么可以直接就可以交换了呢?还是用上面的例子来说,两个人交换苹果和桔子但是每人只有一个手,也不借助其它的容器,那如何进行哟?有办法,就只是用一个手拿两样东西,也就是说先将苹果(桔子)给另一个人用一只手拿着,再从他手上拿桔子(苹果)。基本也就是代码的意思了。
结论2:看似不可能,但却可以的,要做的是仔细的去挖掘,多思考。
那上面的代码是不是就没有问题了?有。要考虑溢出的问题,程序中有一个加法,很可能使结果超出范围,也就是说一只手要是拿不了一个苹果和桔子怎样办?
要相信有问题是可以解决的,可以用assert等等方面处理一下,但不是最好,继续有如下的代码
1: inline void Swap(int *a, int *b)
2: {
3: *a ^= *b;
4: *b ^= *a;
5: *a ^= *b;
6: }
相关文章推荐
- 怎样不用临时变量而交换两个变量的值?——看一中文编程语言中的“完美”一例
- 不用临时变量交换两个变量的值
- 交换两个整数值,不用临时变量
- 交换两个数,不用临时变量
- 用异或运算符实现不用第三个临时变量交换两个变量的值
- 使用位运算交换两个值,不用临时变量
- 交换两个整数值,不用临时变量
- 不用临时变量实现两个变量交换
- 从“交换两个变量而不用临时变量”谈起
- 不用临时变量 实现两个变量之间的数据交换
- C++ 不用临时变量交换两个变量的值——函数对象
- 不用临时变量交换两个数据
- 不用临时变量,交换两个变量的值
- 交换两个值,而不用临时变量
- 不用临时变量,只用11个字符交换两个变量的值——窥视C#编译原理的冰山一角
- 交换两个值,不用临时变量
- 不用临时变量交换两个变量的值
- 交换两个值,不用临时变量(C位运算)
- (1.1.2)C的|、||、&、&&、异或、~、!运算 (交换两个值,不用临时变量)
- 交换两个值,不用临时变量(C位运算)