zoukankan      html  css  js  c++  java
  • 温故知新系列(二)交换两个变量的值不用第三个变量

      对于允许用第三个变量来转存交换两个变量的值,有指针和引用。这里很简单,直接给出代码

      View Code

      

      不用第三个变量交换,可以通过以下两个方法

      View Code
    1 a^=b; 
    2 b^=a;
    3 a^=b;
    4 //或者
    5 a+=b;
    6 b=a-b;
    7 a=a-b;

      第一次见到是从刘汝佳老师的书上看到的,但不推荐 我们去使用。

      一直以为这是一个挺不错的想法,当然,虽然不会去用,但从没有去想以上会有bug。偶尔看到这个博文,发现原来这样的交换是有隐患的:

      当两个数的地址相同的时候,结果会变为0。

      View Code
     1 #include <iostream>
     2 #include <cstdio>
     3 using namespace std;
     4 
     5 void Swap(int &a , int &b)
     6 {
     7     a+=b;
     8     cout<<a<<" "<<b<<endl;
     9     b=a-b;
    10     cout<<a<<" "<<b<<endl;
    11     a=a-b;
    12 }
    13 
    14 int main()
    15 {
    16     int i=20;
    17     Swap(i,i);
    18     cout<<i<<endl;
    19     return 0;
    20 }

      从上面的交换过程中的输出,我们发现,第一次a=a+b;的时候,a变成了40,但,别忘了,b和a是指向同一个地址的,也就是说,b的值也变化了,并且永远和a相

      等,这就是为什么交换后为0的缘由了。

      解决方法也很简单,就是在用两个变量交换的时候,判断a,b是否相等即可。

    作者:FreeAquar
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    sdibt 1251 进化树问题
    hdu 2014 位运算
    poj 3254 状态压缩dp
    hdu 5040bfs+优先队列 需要存状态
    zoj 3812 状压dp
    C++标准库:bitset 用法整理&&zoj 3812
    BZOJ 2572 高速公路
    BZOJ 1036 树的统计
    BZOJ 1035 Risk
    BZOJ 1034 泡泡堂
  • 原文地址:https://www.cnblogs.com/FreeAquar/p/2603381.html
Copyright © 2011-2022 走看看